reifydb_store_column/backend/memory/
mod.rs1use 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 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}