Skip to main content

reifydb_store_column/backend/memory/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use std::sync::Arc;
5
6use crossbeam_skiplist::SkipMap;
7use reifydb_core::{
8	common::CommitVersion,
9	value::column::{compressed::CompressedColumn, data::ColumnData},
10};
11use reifydb_type::Result;
12
13use crate::{ColumnStatistics, Partition, PartitionKey, backend::ColumnBackend, statistics::merge};
14
15#[derive(Clone)]
16pub struct MemoryColumnBackend {
17	partitions: Arc<SkipMap<PartitionKey, Partition>>,
18}
19
20impl MemoryColumnBackend {
21	pub fn new() -> Self {
22		Self {
23			partitions: Arc::new(SkipMap::new()),
24		}
25	}
26
27	pub fn insert(&self, version: CommitVersion, columns: Vec<CompressedColumn>) -> Result<()> {
28		let key = PartitionKey::new(0, version);
29		let partition = Partition::new(key.clone(), columns);
30
31		self.partitions.insert(key, partition);
32		Ok(())
33	}
34
35	pub fn scan(&self, version: CommitVersion, _column_indices: &[usize]) -> Result<Vec<ColumnData>> {
36		let key = PartitionKey::new(0, version);
37
38		if let Some(_entry) = self.partitions.get(&key) {
39			todo!("decompress columns")
40		} else {
41			// No data for this version
42			Ok(vec![])
43		}
44	}
45
46	pub fn statistics(&self, column_index: usize) -> Option<ColumnStatistics> {
47		let stats: Vec<_> = self
48			.partitions
49			.iter()
50			.filter_map(|entry| entry.value().statistics.get(column_index).cloned())
51			.collect();
52
53		merge(&stats)
54	}
55
56	pub fn partition_count(&self) -> usize {
57		self.partitions.len()
58	}
59
60	pub fn compressed_size(&self) -> usize {
61		self.partitions.iter().map(|entry| entry.value().compressed_size).sum()
62	}
63
64	pub fn uncompressed_size(&self) -> usize {
65		self.partitions.iter().map(|entry| entry.value().uncompressed_size).sum()
66	}
67
68	pub fn name(&self) -> &str {
69		"memory"
70	}
71
72	pub fn is_available(&self) -> bool {
73		true
74	}
75}
76
77impl Default for MemoryColumnBackend {
78	fn default() -> Self {
79		Self::new()
80	}
81}
82
83impl ColumnBackend for MemoryColumnBackend {
84	fn insert(&self, version: CommitVersion, columns: Vec<CompressedColumn>) -> Result<()> {
85		self.insert(version, columns)
86	}
87
88	fn scan(&self, version: CommitVersion, column_indices: &[usize]) -> Result<Vec<ColumnData>> {
89		self.scan(version, column_indices)
90	}
91
92	fn statistics(&self, column_index: usize) -> Option<ColumnStatistics> {
93		self.statistics(column_index)
94	}
95
96	fn partition_count(&self) -> usize {
97		self.partition_count()
98	}
99
100	fn compressed_size(&self) -> usize {
101		self.compressed_size()
102	}
103
104	fn uncompressed_size(&self) -> usize {
105		self.uncompressed_size()
106	}
107
108	fn name(&self) -> &str {
109		self.name()
110	}
111
112	fn is_available(&self) -> bool {
113		self.is_available()
114	}
115}