use aletheiadb::config::WalConfigBuilder;
use aletheiadb::core::property::PropertyMapBuilder;
use aletheiadb::index::vector::{DistanceMetric, HnswConfig};
use aletheiadb::storage::index_persistence::PersistenceConfig;
use aletheiadb::storage::wal::DurabilityMode;
use aletheiadb::{AletheiaDB, AletheiaDBConfig};
use std::sync::Arc;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let db_path = std::env::current_dir()?.join("example-db-data");
println!("📁 Database location: {}", db_path.display());
let is_existing =
db_path.exists() && db_path.join("wal").exists() && db_path.join("indexes").exists();
if is_existing {
println!("✅ Existing database detected, loading...");
} else {
println!("🆕 Creating new database...");
}
let config = AletheiaDBConfig::builder()
.wal(
WalConfigBuilder::new()
.wal_dir(db_path.join("wal"))
.durability_mode(DurabilityMode::GroupCommit {
max_delay_ms: 10,
max_batch_size: 200,
})
.build(),
)
.persistence(PersistenceConfig {
enabled: true,
data_dir: db_path.join("indexes"),
load_on_startup: true, ..Default::default()
})
.build();
let db = Arc::new(AletheiaDB::with_unified_config(config)?);
println!("✅ Database initialized");
db.vector_index("embedding")
.hnsw(HnswConfig::new(384, DistanceMetric::Cosine))
.enable()?;
println!("✅ Vector index enabled");
if !is_existing {
println!("\n📝 Creating sample data...");
let alice = db.create_node(
"Person",
PropertyMapBuilder::new()
.insert("name", "Alice")
.insert("age", 30i64)
.insert_vector(
"embedding",
&[0.1, 0.2, 0.3], )
.build(),
)?;
let bob = db.create_node(
"Person",
PropertyMapBuilder::new()
.insert("name", "Bob")
.insert("age", 25i64)
.insert_vector("embedding", &[0.15, 0.25, 0.35])
.build(),
)?;
db.create_edge(
alice,
bob,
"KNOWS",
PropertyMapBuilder::new().insert("since", 2020i64).build(),
)?;
println!(" ✓ Created Alice (age 30)");
println!(" ✓ Created Bob (age 25)");
println!(" ✓ Created KNOWS relationship");
}
println!("\n🔍 Querying data...");
let node_count = db.node_count();
let edge_count = db.edge_count();
println!(" 📊 Nodes: {}", node_count);
println!(" 📊 Edges: {}", edge_count);
if node_count > 0 {
println!(" ✓ Data successfully persisted!");
}
println!("\n📂 Database file structure:");
println!(" {}/", db_path.display());
println!(" ├── wal/ # WAL (transaction durability)");
println!(" │ ├── 00000X.log # WAL segments");
println!(" │ └── manifest.json");
println!(" └── indexes/ # Index persistence (fast restart)");
println!(" ├── manifest.idx");
println!(" ├── graph/");
println!(" │ └── adjacency.idx.zst");
println!(" ├── temporal/");
println!(" │ └── versions.idx.zst");
println!(" └── vector/");
println!(" └── embedding/");
println!(" └── current.usearch");
println!("\n💡 Note: Cold storage (Redb) exists but requires manual setup.");
println!(" See docs/guides/tiered-storage-guide.md for configuration.");
println!("\n✅ Done! Data persisted to disk.");
println!(" Run this example again to see fast loading from disk.");
println!("\n💡 Tip: Delete ./example-db-data/ to start fresh");
Ok(())
}