use std::collections::HashMap;
use crate::segment::common::operation_error::OperationResult;
use crate::segment::entry::ReadSegmentEntry;
use crate::segment::types::{PayloadIndexInfo, PayloadKeyType};
use crate::edge::read_view::{EdgeReadView, ReadSegmentHandle};
#[derive(Clone, Debug)]
pub struct ShardInfo {
pub segments_count: usize,
pub points_count: usize,
pub indexed_vectors_count: usize,
pub payload_schema: HashMap<PayloadKeyType, PayloadIndexInfo>,
}
impl<H: ReadSegmentHandle> EdgeReadView<H> {
pub(crate) fn info(&self) -> OperationResult<ShardInfo> {
let mut segments_count = 0;
let mut points_count = 0;
let mut indexed_vectors_count = 0;
let mut payload_schema = HashMap::new();
for segment in &self.segments {
segments_count += 1;
let segment_info = segment.read_segment().info()?;
points_count += segment_info.num_points;
indexed_vectors_count += segment_info.num_indexed_vectors;
for (payload_key, payload_index) in segment_info.index_schema {
payload_schema
.entry(payload_key)
.and_modify(|total: &mut PayloadIndexInfo| total.points += payload_index.points)
.or_insert(payload_index);
}
}
Ok(ShardInfo {
segments_count,
points_count,
indexed_vectors_count,
payload_schema,
})
}
}