use std::collections::BTreeSet;
use super::prelude::*;
#[derive(Debug)]
pub struct BlobSummaryCollector {
header: BlobHeader,
records: usize,
deleted_records: usize,
keys: BTreeSet<Vec<u8>>,
deleted_keys: BTreeSet<Vec<u8>>,
}
impl BlobSummaryCollector {
pub fn from_path(path: &Path, full_load: bool) -> Result<Self> {
if full_load {
Self::load_full(path)
} else {
Self::load_header_only(path)
}
}
fn load_full(path: &Path) -> Result<Self> {
let mut reader = BlobReader::from_path(path)?;
let header = reader.read_header()?;
let mut collector = Self::short(header);
while !reader.is_eof() {
let record = reader.read_record(false)?;
if record.header().is_deleted() {
collector.add_deleted_record(record);
} else {
collector.add_record(record);
}
}
Ok(collector)
}
fn load_header_only(path: &Path) -> Result<Self> {
let mut reader = BlobReader::from_path(path)?;
let header = reader.read_header()?;
Ok(Self::short(header))
}
fn short(header: BlobHeader) -> Self {
Self {
header,
records: Default::default(),
deleted_records: Default::default(),
keys: Default::default(),
deleted_keys: Default::default(),
}
}
fn add_record(&mut self, record: Record) {
self.records += 1;
self.keys.insert(record.header().key().to_vec());
}
fn add_deleted_record(&mut self, record: Record) {
self.deleted_records += 1;
self.deleted_keys.insert(record.header().key().to_vec());
}
pub fn records(&self) -> usize {
self.records
}
pub fn deleted_records(&self) -> usize {
self.deleted_records
}
pub fn unique_keys_count(&self) -> usize {
self.keys.len()
}
pub fn unique_deleted_keys_count(&self) -> usize {
self.deleted_keys.len()
}
pub fn header_magic_byte(&self) -> u64 {
self.header.magic_byte
}
pub fn header_version(&self) -> u32 {
self.header.version
}
pub fn header_flags(&self) -> u64 {
self.header.flags
}
}
#[derive(Debug)]
pub struct IndexSummaryCollector {
header: IndexHeader,
records: usize,
keys: BTreeSet<Vec<u8>>,
}
impl IndexSummaryCollector {
pub fn from_path(path: &Path) -> Result<Self> {
let header = read_index_header(path)?;
let headers = read_index_sync(path)?;
let mut collector = Self::empty(header);
for headers in headers.values() {
for header in headers {
collector.add_record(header.clone());
}
}
Ok(collector)
}
fn empty(header: IndexHeader) -> Self {
Self {
header,
records: Default::default(),
keys: Default::default(),
}
}
fn add_record(&mut self, header: record::Header) {
self.records += 1;
self.keys.insert(header.key().to_vec());
}
pub fn records_readed(&self) -> usize {
self.records
}
pub fn unique_keys_count(&self) -> usize {
self.keys.len()
}
pub fn header_version(&self) -> u8 {
self.header.version()
}
pub fn header_hash(&self) -> Vec<u8> {
self.header.hash.clone()
}
pub fn header_meta_size(&self) -> usize {
self.header.meta_size
}
pub fn header_records_count(&self) -> usize {
self.header.records_count
}
pub fn header_is_written(&self) -> bool {
self.header.is_written()
}
pub fn header_record_header_size(&self) -> usize {
self.header.record_header_size
}
pub fn header_key_size(&self) -> u16 {
self.header.key_size()
}
}