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.
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/Cargo.lock +2 -2
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/PKG-INFO +1 -1
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/pyproject.toml +1 -1
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/Cargo.toml +1 -1
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/impl_.rs +56 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend.rs +37 -0
- sqlitegraph-0.3.0/sqlitegraph-core/src/graph/edge_ops.rs +118 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/entity_ops.rs +57 -0
- sqlitegraph-0.3.0/sqlitegraph-core/tests/bulk_insert_tests.rs +173 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/CHANGELOG.md +21 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/Cargo.toml +1 -1
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/src/lib.rs +96 -0
- sqlitegraph-0.3.0/sqlitegraph-py/tests/test_bulk_insert.py +118 -0
- sqlitegraph-0.2.0/sqlitegraph-core/src/graph/edge_ops.rs +0 -58
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/Cargo.toml +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/README.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/python/sqlitegraph/__init__.py +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/python/sqlitegraph/_native.pyi +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/python/sqlitegraph/py.typed +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/.gitignore +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/BLOCK_AWARE_CACHE_BEHAVIOR_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/BLOCK_LOCALITY_PROTOTYPE_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/BUG_10K_INVESTIGATION_SUMMARY.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/BUG_SNAPSHOTID_SQLITE_BACKEND.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/CACHE_CAPACITY_SWEEP_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/CACHE_CLONE_FIX_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/CHANGELOG.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/COLD_PATH_FORENSICS_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/COLD_WARM_BENCHMARK_SPLIT_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/EDGE_CORRUPTION_ROOT_CAUSE.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/LICENSE +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/MAIN_BENCHMARK_RERUN_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/NODE_PAGE_OVERFLOW_FIX_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/PAGE_ID_COLLISION_ROOT_CAUSE.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/PHASE3_NODE_PAGE_CACHE_FIX_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/PHYSICAL_BLOCK_PLACEMENT_PROTOTYPE_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/README.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/REBUILD_INDEXES_FIX_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/REOPEN_CORRUPTION_FORENSICS.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_10K_NODE_BUG_FIX.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_FILE_IO_COORDINATION.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_FORENSIC_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/V3_REGRESSION_SWEEP_REPORT.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/adaptive_page_simple.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/adjlist_benchmark.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/algo_benchmarks.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/backend_comparison.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/bench_utils.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/bfs.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/cold_cache.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/comparative_benchmark.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/comprehensive_performance.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/compression_benchmark.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/concurrent_access.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/connection_pool.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/graph_generators.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/graph_theory_benchmarks.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/hnsw.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/hnsw_multilayer.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/insert.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/k_hop.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/memory_profiling.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/mvcc_benchmarks.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/native_disk_io.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/parallel_bfs.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/read_path_benchmarks.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/real_datasets.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_memory.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_non_chain_patterns.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_pubsub_memory.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_pubsub_non_chain.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_pubsub_write_cost.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/regression_write_cost.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/sqlite_v3_comparison.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/v3_algorithm_benchmarks.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/v3_backend_benchmarks.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/benches/wal_recovery_benchmarks.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/clippy.toml +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/core.d +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/debug_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/HNSW_DEVELOPMENT_RULES.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/HNSW_VECTOR_INTEGRATION_FUTURE_ROADMAP.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/SEQUENTIAL_IO_PERFORMANCE.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/WAL_MODE_IMPLEMENTATION_GUIDE.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase-40-benchmark-report.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase10_performance_tuning.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase11_native_perf_plan.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase12_optimization_plan.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase14_step9_khop_corruption_codebase_mapping.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase29_step7_mmap_preaudit_notes.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase5_real_adjacency.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase6_implementation_status.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase6_native_graphbackend_plan.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/phase7_native_backend_refactor.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/docs/superpowers/plans/2026-04-23-task-1-analysis.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/algo_benchmark.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/basic_functionality_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/batch_bench.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/batch_stress_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/bench_parallel_bfs.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/block_locality_benchmark.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cache_capacity_benchmark.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cache_clone_forensics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cache_perf_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/cold_path_decomposition.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/compression_analysis.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/compression_detailed.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/compression_diagnostics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/crash_test_child.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/debug_buffer_error.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/get_node_cache_sweep.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/phase53_1_execution.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/phase55_simple_benchmark.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/reopen_corruption_repro.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_100k.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_adaptive_pages.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_allocator_startup.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_batch_simple.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_binary_search.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_btree_100k.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_cache_warm.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_chunked_bfs.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_delta_encoding.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_direct_backend_benchmark.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_direct_edgestore.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_edge_store_direct.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_edgestore_perf.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_index_restore.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_index_staleness.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_lazy_decode.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_lock_overhead.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_native_edge.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_neighbors_cache.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_neighbors_detailed.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_neighbors_profile.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_open_detailed_timing.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_open_roundtrip.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_open_stage_timing.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_performance_comparison.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_rwlock_overhead.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_sqlite_neighbors_perf.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_v3_neighbors_perf.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/test_vec_clone.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_forensic_page_analysis.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_forensics_example.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_get_node_profile.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_offset_forensic.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_perf_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_readonly_profile.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/examples/v3_reopen_verify.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/libtest_syntax.rlib +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/manual.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/snapshot_export/snapshot_1766284406.v2 +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/snapshot_export/snapshot_1766284420.v2 +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/sqlitegraph_bench.json +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/centrality.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/graph_ops.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/backend/traversal.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/call_graph_analysis.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/centrality.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/community.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/control_dependence.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/critical_path.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/cut_partition.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/cycle_basis.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/dominance_frontiers.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/dominators.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/graph_diff.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/graph_rewriting.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/graph_similarity.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/natural_loops.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/observability.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/path_enumeration.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/post_dominators.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/program_slicing.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/reachability.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/scc.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/structure.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/subgraph_isomorphism.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/taint_analysis.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/topological_sort.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/transitive_closure.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/transitive_reduction.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/algo/wcc.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/api_ergonomics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/constants.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/cpu_tuning.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/aliases.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/cpu_profile.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/errors.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/flags.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/kv_types.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/types/utils.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/algorithm/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/algorithm/parallel_bfs.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/allocator.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/backend.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/btree.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compact_edge_record.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/delta.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/edge_delta.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/compression/varint.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/constants.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/edge_compat.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/file_coordinator.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/forensics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/header.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/index/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/index/page.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/index_persistence.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kind_index.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kv_store/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kv_store/store.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/kv_store/types.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/lazy_init_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/name_index.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/block_cache.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/cache.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/page.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/record.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/store.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/node/tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/pubsub/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/pubsub/publisher.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/pubsub/types.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/storage/adaptive_page.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/storage/media_detector.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/storage/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/string_table/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/string_table/table.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/string_table/tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/tests/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/wal.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/native/v3/write_batch.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/helpers.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/kv_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/pubsub_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend/sqlite/types.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/backend_selector.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_gates.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_meta.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_regression.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bench_utils.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/bfs.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/cache.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/client.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/factory.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/graph_config.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/kinds.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/native.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/config/sqlite.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/dependency_monitor.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/dsl.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/errors.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/fault_injection.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/adjacency.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/core.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/instrumented.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/metrics_core.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/metrics_snapshot.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/statement_tracker.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics/utils.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/metrics_schema.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/pattern_matching.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/pool.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/snapshot.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph/types.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/graph_opt.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/batch_filter.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/builder.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/config.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/distance_functions.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/distance_metric.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/errors.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index_api.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index_internal.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/index_persist.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/layer.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/multilayer.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/neighborhood.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/serialization.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/simd.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/storage.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/v3_storage.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/hnsw/v3_storage_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/index.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/engine.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/sampling.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/inference/simd.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/introspection.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/lib.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/multi_hop.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/mvcc.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/matcher.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/pattern.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/property.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/query.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine/tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/edge_validation.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/fast_path_detection.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/fast_path_execution.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/pattern_engine_cache/tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/progress.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/query.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/query_cache.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/reasoning.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/recovery.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/schema.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/src/snapshot.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/acid_regression_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/acid_snapshot_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/algo_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/backend_selector_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_data_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_gate_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_gates_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_meta_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bench_report_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/benchmark_isolation_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bfs_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/bincode_compatibility_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cache_effectiveness_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cache_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/check_write_path.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cluster_offset_corruption_regression.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/cold_path_forensics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_file_size.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_index_rebuilding.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_overflow.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/debug_scenario_c.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/deterministic_index_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/direct_file_read_corruption_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/doc_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_corruption_minimal.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_corruption_repro.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_insertion_corruption_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/edge_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/entity_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/file_extension_debug.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/fuzz_common.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/get_node_forensics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/graph_node_existence_enforcement.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/graph_opt_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/helpers/mod.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/hnsw_persistence_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/index_persistence_integration.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/index_persistence_validation.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/index_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/instrumentation_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/integration_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/isolate_open_bug.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/json_parsing_diagnostics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/kv_durability_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/lib_api_smoke_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/multi_hop_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/multi_node_corruption_regression.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_baseline_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_concurrent_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_edge_case_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_snapshot_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/mvcc_wal_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/native_edge_insertion_regression.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/node_overflow_forensics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/node_read_forensics_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/node_slot_transaction_persistence.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/oom_reproduction_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/page_42_debug.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/page_write_debug.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/pattern_cache_fastpath_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/pattern_engine_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/pattern_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/perf_gate_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/perf_gate_v32_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase32_cluster_pipeline_reconstruction_tests_clean.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase44_2_cluster_size_contract_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase64_node_count_durability_regression.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase65_cluster_size_corruption_regression.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/phase73_node_count_corruption_capture.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/query_cache_performance_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/query_cache_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/query_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/recovery_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/regression_concurrent_traversal.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/reopen_corruption_investigation.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/reopen_integration_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/rowid_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/schema_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/snapshot_isolation_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/sqlite_reopen_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/sqlite_snapshot_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/test_10k_bug_reproduction.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/transaction_begin_corruption_proof.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/unsafe_invariants_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_algorithm_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_block_locality_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_btree_forensics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_check_nodepages.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_dump_page_headers.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_edge_durability_tdd.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_file_write_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_focused_perf.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_forensics_test.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_header_forensics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_insert_read_forensics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_integrity_check.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_kind_index_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_name_index_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_page_ownership_forensics.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_persistence_100.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_query_truth_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_regression_sweep.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_reopen_durability.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_sync_fix_validation.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/v3_verify_file_persistence.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/wal_mode_default_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/wal_tuning_tests.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-core/tests/write_buffer_coherence_regression.rs +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/.gitignore +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/README.md +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/01_basic_crud.py +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/02_graph_algorithms.py +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/03_vector_search.py +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/04_social_network.py +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/examples/05_file_backed.py +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_algo.py +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_basic.py +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_crud.py +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_errors.py +0 -0
- {sqlitegraph-0.2.0 → sqlitegraph-0.3.0}/sqlitegraph-py/tests/test_filtered_traversal.py +0 -0
- {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.
|
|
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.
|
|
1431
|
+
version = "0.3.0"
|
|
1432
1432
|
dependencies = [
|
|
1433
1433
|
"ndarray 0.16.1",
|
|
1434
1434
|
"numpy",
|
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sqlitegraph"
|
|
7
|
-
version = "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
|
+
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
|
|
@@ -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:
|