Skip to main content

Crate sqry_db

Crate sqry_db 

Source
Expand description

sqry-db: Salsa-style incremental computation engine for sqry.

This crate provides a demand-driven memoized query engine with file-level dependency tracking, three-tier cache invalidation, and incremental indexing support. All analysis queries (callers, callees, dependency impact, unused detection, etc.) are expressed as DerivedQuery implementations whose results are cached in a 64-shard ShardedCache and automatically invalidated when their input dependencies change.

§Architecture

┌─────────────┐      ┌──────────────────┐      ┌──────────────���─┐
│  MCP / CLI   │─────▶│     QueryDb      │─────▶│  GraphSnapshot │
│  handlers    │      │  (ShardedCache)   │      │  (immutable)   │
└─────────────┘      └──────────────────┘      └────���───────────┘
                            │                          │
                      ┌─────┴──────┐           ┌──────┴───────┐
                      │ FileInput  │           │  NodeArena   │
                      │   Store    │           │  EdgeStore   │
                      └────────────┘           └──────────────┘

§Three-Tier Invalidation

  • Tier 1 — File-level deps: Every query records the FileId of every node it reads. Invalidated when any recorded file’s revision bumps.
  • Tier 2 — Global edge revision: A single AtomicU64 that increments when any file’s edges change. Reverse queries (callers_of, is_node_in_cycle) set TRACKS_EDGE_REVISION = true.
  • Tier 3 — Global metadata revision: A single AtomicU64 that increments when node metadata changes. find_unused sets TRACKS_METADATA_REVISION = true.

§Usage

use sqry_db::{QueryDb, QueryDbConfig};

let config = QueryDbConfig::default();
let db = QueryDb::new(snapshot, config);
let result = db.get::<CallersQuery>(&node_id);

Re-exports§

pub use cache::ShardedCache;
pub use comparative::ChangeType;
pub use comparative::ComparativeQueryDb;
pub use comparative::DiffOptions;
pub use comparative::DiffOutput;
pub use comparative::DiffSummary;
pub use comparative::NodeChange;
pub use comparative::NodeLocation;
pub use config::QueryDbConfig;
pub use dependency::DependencyRecorderGuard;
pub use input::FileInput;
pub use input::FileInputStore;
pub use persistence::DERIVED_FORMAT_VERSION;
pub use persistence::DERIVED_MAGIC;
pub use persistence::DerivedHeader;
pub use persistence::DerivedManifest;
pub use persistence::LoadError;
pub use persistence::LoadOutcome;
pub use persistence::PersistedEntry;
pub use persistence::QueryDeps;
pub use persistence::SkipReason;
pub use persistence::StagedEntry;
pub use persistence::load_derived;
pub use queries::dispatch::derived_path;
pub use queries::dispatch::load_derived_opportunistic;
pub use queries::dispatch::make_query_db_cold;
pub use query::DerivedQuery;
pub use query::QueryKey;
pub use query::QueryRegistry;

Modules§

cache
64-shard query cache with three-tier invalidation.
compaction
Async background compaction for the graph arena.
comparative
ComparativeQueryDb for cross-snapshot operations.
config
Configuration for QueryDb.
dependency
Thread-local dependency recording with RAII cleanup.
input
File-level input storage with per-file revision counters.
persistence
Derived facts persistence to .sqry/graph/derived.sqry.
planner
Structural query planner for sqry-db.
queries
Derived queries: SCC, condensation, reachability, plus relation and analysis queries migrated from sqry-core::query::executor::graph_eval.
query
Derived query trait and TypeId-based query registry.

Structs§

QueryDb
The central incremental computation database.
QueryDbMetrics
Lightweight snapshot of QueryDb cache-usage counters.