refactor info

This commit is contained in:
Alex Mikhalev 2021-11-19 21:52:17 -08:00
parent 32e4bee157
commit 50fa2b43e3

View File

@ -1,11 +1,11 @@
use std::collections::HashMap; use std::{collections::HashMap, io};
use eyre::{bail, Context}; use eyre::{bail, Context};
use rayon::prelude::*; use rayon::prelude::*;
use crate::{ use crate::{
chunk::{read_chunk, MessageDataHeader}, chunk::{read_chunk, ChunkHeader, MessageDataHeader},
index::BagIndex, index::{BagIndex, IndexData},
parse::Op, parse::Op,
reader::{BagReader, SliceReader}, reader::{BagReader, SliceReader},
Result, Result,
@ -26,23 +26,36 @@ impl BagInfo {
self self
} }
pub fn compute<R: BagReader + Clone + Send + Sync>(reader: &mut R, index: &BagIndex) -> Result<BagInfo> { pub fn compute<R: BagReader + Clone + Send + Sync>(
reader: &mut R,
index: &BagIndex,
) -> Result<BagInfo> {
index
.chunks
.par_iter()
.try_fold(BagInfo::default, |mut info, chunk| -> Result<_> {
let mut reader = reader.clone();
reader.seek(io::SeekFrom::Start(chunk.pos))?;
let chunk_header = ChunkHeader::read(&mut reader)?;
info.total_uncompressed += chunk_header.uncompressed_size as u64;
reader.skip_data()?;
for _ in &chunk.connections {
let index = IndexData::read(&mut reader)?;
*info.per_connection.entry(index.conn_id).or_insert(0) +=
index.entries.len() as u64;
}
Ok(info)
})
.try_reduce(BagInfo::default, |a, b| Ok(a.combine(b)))
}
pub fn compute_without_index<R: BagReader + Clone + Send + Sync>(
reader: &mut R,
index: &BagIndex,
) -> Result<BagInfo> {
index index
.chunks .chunks
.par_iter() .par_iter()
// .try_fold(BagInfo::default, |mut info, chunk| -> rsbag::Result<_> {
// let mut reader = reader.clone();
// reader.seek(io::SeekFrom::Start(chunk.pos))?;
// let chunk_header = ChunkHeader::read(&mut reader)?;
// info.total_uncompressed += chunk_header.uncompressed_size as u64;
// reader.skip_data()?;
// for _ in &chunk.connections {
// let index = IndexData::read(&mut reader)?;
// *info.per_connection.entry(index.conn_id).or_insert(0) +=
// index.entries.len() as u64;
// }
// Ok(info)
// })
.try_fold(BagInfo::default, |mut info, chunk| -> Result<_> { .try_fold(BagInfo::default, |mut info, chunk| -> Result<_> {
let mut reader = reader.clone(); let mut reader = reader.clone();
let data = read_chunk(&mut reader, chunk.pos) let data = read_chunk(&mut reader, chunk.pos)