From d908e83dabeb1ce9927c94e2ac3e4a9baa1ec3f8 Mon Sep 17 00:00:00 2001 From: Alexander Weiss Date: Mon, 7 Feb 2022 20:52:18 +0100 Subject: [PATCH] add BoomIndex --- src/blob/mod.rs | 6 +++--- src/commands/ls.rs | 4 ++-- src/id.rs | 2 +- src/index/boom.rs | 37 +++++++++++++++++++++++++++++++++++++ src/index/mod.rs | 4 ++++ 5 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 src/index/boom.rs diff --git a/src/blob/mod.rs b/src/blob/mod.rs index 9285ed1..28bd324 100644 --- a/src/blob/mod.rs +++ b/src/blob/mod.rs @@ -16,20 +16,20 @@ pub enum BlobType { Tree, } -#[derive(Debug, PartialEq, Constructor)] +#[derive(Debug, PartialEq, Clone, Constructor)] pub struct Blob { tpe: BlobType, id: Id, } -#[derive(Debug, Constructor)] +#[derive(Debug, Clone, Constructor)] pub struct BlobInformation { blob: Blob, offset: u32, length: u32, } -#[derive(Debug, Constructor)] +#[derive(Debug, Clone, Constructor)] pub struct IndexEntry { pack: Id, bi: BlobInformation, diff --git a/src/commands/ls.rs b/src/commands/ls.rs index dd56483..3fad98f 100644 --- a/src/commands/ls.rs +++ b/src/commands/ls.rs @@ -4,7 +4,7 @@ use clap::Parser; use crate::backend::{FileType, MapResult, ReadBackend}; use crate::blob::TreeIterator; use crate::id::Id; -use crate::index::indexfiles::AllIndexFiles; +use crate::index::{AllIndexFiles, BoomIndex}; use crate::repo::SnapshotFile; #[derive(Parser)] @@ -24,7 +24,7 @@ pub(super) fn execute(be: &impl ReadBackend, opts: Opts) -> Result<()> { } })?; - let index = AllIndexFiles::new(be.clone()); + let index= BoomIndex::from_iter(AllIndexFiles::new(be.clone()).into_iter()); let snap = SnapshotFile::from_backend(be, id)?; for path_node in TreeIterator::from_id(be.clone(), index, snap.tree) { diff --git a/src/id.rs b/src/id.rs index 9db7fce..6f04657 100644 --- a/src/id.rs +++ b/src/id.rs @@ -2,7 +2,7 @@ use derive_more::Display; use serde::{Deserialize, Serialize}; use thiserror::Error; -#[derive(Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize, Display)] +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize, Display)] #[display(fmt = "{}", "&self.to_hex()[0..8]")] pub struct Id( #[serde(serialize_with = "hex::serde::serialize")] diff --git a/src/index/boom.rs b/src/index/boom.rs new file mode 100644 index 0000000..f2d05ea --- /dev/null +++ b/src/index/boom.rs @@ -0,0 +1,37 @@ +use boomphf::hashmap::BoomHashMap; + +use super::{AllIndexFiles, ReadIndex}; +use crate::backend::ReadBackend; +use crate::blob::IndexEntry; +use crate::id::Id; + +pub struct BoomIndex(BoomHashMap); + +impl BoomIndex { + pub fn from_all_indexfiles(aif: AllIndexFiles) -> Self { + Self::from_iter(aif.into_iter()) + } +} + +impl FromIterator for BoomIndex { + fn from_iter(iter: T) -> Self + where + T: IntoIterator, + { + let mut ids = Vec::new(); + let mut ies = Vec::new(); + + for ie in iter { + ids.push(*ie.id()); + ies.push(ie); + } + + BoomIndex(BoomHashMap::new(ids, ies)) + } +} + +impl ReadIndex for BoomIndex { + fn get_id(&self, id: &Id) -> Option { + self.0.get(id).map(IndexEntry::clone) + } +} diff --git a/src/index/mod.rs b/src/index/mod.rs index 16f9734..d191bc2 100644 --- a/src/index/mod.rs +++ b/src/index/mod.rs @@ -1,5 +1,9 @@ +pub mod boom; pub mod indexfiles; +pub use boom::*; +pub use indexfiles::*; + use crate::blob::IndexEntry; use crate::id::Id;