use std::path::Path;
use byteorder::BE;
use heed::{
Database, DatabaseFlags, Env, EnvOpenOptions,
types::{Bytes, Str, U64, Unit},
};
use crate::error::Error;
pub struct Storage {
pub env: Env,
pub nodes: Database<U64<BE>, Bytes>, pub edges: Database<U64<BE>, Bytes>,
pub out_adj: Database<U64<BE>, Bytes>, pub in_adj: Database<U64<BE>, Bytes>,
pub label_idx: Database<Bytes, Unit>, pub type_idx: Database<Bytes, Unit>,
pub node_prop_idx: Database<Bytes, Unit>,
pub edge_prop_idx: Database<Bytes, Unit>,
pub fts_postings: Database<Bytes, Bytes>, pub fts_docs: Database<Bytes, Bytes>,
pub vectors: Database<U64<BE>, Bytes>,
pub meta: Database<Str, Bytes>, }
impl Storage {
pub fn open(path: &Path, map_size_gb: usize) -> Result<Self, Error> {
std::fs::create_dir_all(path)?;
let env = unsafe {
EnvOpenOptions::new()
.map_size(map_size_gb * 1024 * 1024 * 1024)
.max_dbs(12)
.open(path)?
};
let mut wtxn = env.write_txn()?;
let nodes = env.create_database(&mut wtxn, Some("nodes"))?;
let edges = env.create_database(&mut wtxn, Some("edges"))?;
let out_adj = env
.database_options()
.types::<U64<BE>, Bytes>()
.name("out_adj")
.flags(DatabaseFlags::DUP_SORT | DatabaseFlags::DUP_FIXED)
.create(&mut wtxn)?;
let in_adj = env
.database_options()
.types::<U64<BE>, Bytes>()
.name("in_adj")
.flags(DatabaseFlags::DUP_SORT | DatabaseFlags::DUP_FIXED)
.create(&mut wtxn)?;
let label_idx = env.create_database(&mut wtxn, Some("label_idx"))?;
let type_idx = env.create_database(&mut wtxn, Some("type_idx"))?;
let node_prop_idx = env.create_database(&mut wtxn, Some("node_prop_idx"))?;
let edge_prop_idx = env.create_database(&mut wtxn, Some("edge_prop_idx"))?;
let fts_postings = env
.database_options()
.types::<Bytes, Bytes>()
.name("fts_postings")
.flags(DatabaseFlags::DUP_SORT | DatabaseFlags::DUP_FIXED)
.create(&mut wtxn)?;
let fts_docs = env.create_database(&mut wtxn, Some("fts_docs"))?;
let vectors = env.create_database(&mut wtxn, Some("vectors"))?;
let meta = env.create_database(&mut wtxn, Some("meta"))?;
wtxn.commit()?;
Ok(Self {
env,
nodes,
edges,
out_adj,
in_adj,
label_idx,
type_idx,
node_prop_idx,
edge_prop_idx,
fts_postings,
fts_docs,
vectors,
meta,
})
}
}