Skip to main content

reifydb_store_column/
partition.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_core::{common::CommitVersion, value::column::compressed::CompressedColumn};
5
6use crate::ColumnStatistics;
7
8#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
9pub struct PartitionKey {
10	pub source: u64,
11	pub version: CommitVersion,
12}
13
14impl PartitionKey {
15	pub fn new(source: u64, version: CommitVersion) -> Self {
16		Self {
17			source,
18			version,
19		}
20	}
21}
22
23#[derive(Clone)]
24pub struct Partition {
25	pub key: PartitionKey,
26	pub columns: Vec<CompressedColumn>,
27	pub statistics: Vec<ColumnStatistics>,
28	pub row_count: usize,
29	pub compressed_size: usize,
30	pub uncompressed_size: usize,
31}
32
33impl Partition {
34	pub fn new(key: PartitionKey, columns: Vec<CompressedColumn>) -> Self {
35		let row_count = columns.first().map_or(0, |c| c.row_count);
36		let compressed_size: usize = columns.iter().map(|c| c.data.len()).sum();
37		let uncompressed_size: usize = columns.iter().map(|c| c.uncompressed_size).sum();
38
39		// let statistics = columns.iter().map(|col| ColumnStatistics::from_compressed(col)).collect();
40
41		Self {
42			key,
43			columns,
44			statistics: vec![],
45			row_count,
46			compressed_size,
47			uncompressed_size,
48		}
49	}
50
51	pub fn compression_ratio(&self) -> f64 {
52		if self.uncompressed_size == 0 {
53			1.0
54		} else {
55			self.compressed_size as f64 / self.uncompressed_size as f64
56		}
57	}
58}