Skip to main content

reifydb_core/interface/catalog/
view.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use reifydb_codec::row::shape::RowFamily;
5use reifydb_value::value::sumtype::SumTypeId;
6use serde::{Deserialize, Serialize};
7
8use crate::{
9	interface::catalog::{
10		column::{Column, ColumnIndex},
11		id::{NamespaceId, RingBufferId, SeriesId, TableId, ViewId},
12		key::PrimaryKey,
13		series::SeriesKey,
14		storage::StorageId,
15	},
16	sort::SortDirection,
17};
18
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
20pub struct ViewSortKey {
21	pub column: ColumnIndex,
22	pub direction: SortDirection,
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
26pub enum ViewKind {
27	Deferred,
28	Transactional,
29}
30
31#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
32#[repr(u8)]
33pub enum ViewStorageKind {
34	Table = 1,
35	RingBuffer = 2,
36	Series = 3,
37}
38
39impl ViewStorageKind {
40	pub fn row_family(self) -> RowFamily {
41		match self {
42			Self::Table => RowFamily::Table,
43			Self::RingBuffer => RowFamily::RingBuffer,
44			Self::Series => RowFamily::Series,
45		}
46	}
47}
48
49#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
50pub struct TableView {
51	pub id: ViewId,
52	pub namespace: NamespaceId,
53	pub name: String,
54	pub kind: ViewKind,
55	pub columns: Vec<Column>,
56	pub primary_key: Option<PrimaryKey>,
57	pub storage: TableId,
58	pub sort: Vec<ViewSortKey>,
59}
60
61#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
62pub struct RingBufferView {
63	pub id: ViewId,
64	pub namespace: NamespaceId,
65	pub name: String,
66	pub kind: ViewKind,
67	pub columns: Vec<Column>,
68	pub primary_key: Option<PrimaryKey>,
69	pub storage: RingBufferId,
70	pub capacity: u64,
71	pub sort: Vec<ViewSortKey>,
72}
73
74#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
75pub struct SeriesView {
76	pub id: ViewId,
77	pub namespace: NamespaceId,
78	pub name: String,
79	pub kind: ViewKind,
80	pub columns: Vec<Column>,
81	pub primary_key: Option<PrimaryKey>,
82	pub storage: SeriesId,
83	pub key: SeriesKey,
84	pub tag: Option<SumTypeId>,
85	pub sort: Vec<ViewSortKey>,
86}
87
88#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
89pub enum View {
90	Table(TableView),
91	RingBuffer(RingBufferView),
92	Series(SeriesView),
93}
94
95impl View {
96	pub fn id(&self) -> ViewId {
97		match self {
98			View::Table(t) => t.id,
99			View::RingBuffer(rb) => rb.id,
100			View::Series(s) => s.id,
101		}
102	}
103
104	pub fn namespace(&self) -> NamespaceId {
105		match self {
106			View::Table(t) => t.namespace,
107			View::RingBuffer(rb) => rb.namespace,
108			View::Series(s) => s.namespace,
109		}
110	}
111
112	pub fn name(&self) -> &str {
113		match self {
114			View::Table(t) => &t.name,
115			View::RingBuffer(rb) => &rb.name,
116			View::Series(s) => &s.name,
117		}
118	}
119
120	pub fn kind(&self) -> ViewKind {
121		match self {
122			View::Table(t) => t.kind,
123			View::RingBuffer(rb) => rb.kind,
124			View::Series(s) => s.kind,
125		}
126	}
127
128	pub fn columns(&self) -> &[Column] {
129		match self {
130			View::Table(t) => &t.columns,
131			View::RingBuffer(rb) => &rb.columns,
132			View::Series(s) => &s.columns,
133		}
134	}
135
136	pub fn columns_mut(&mut self) -> &mut Vec<Column> {
137		match self {
138			View::Table(t) => &mut t.columns,
139			View::RingBuffer(rb) => &mut rb.columns,
140			View::Series(s) => &mut s.columns,
141		}
142	}
143
144	pub fn primary_key(&self) -> Option<&PrimaryKey> {
145		match self {
146			View::Table(t) => t.primary_key.as_ref(),
147			View::RingBuffer(rb) => rb.primary_key.as_ref(),
148			View::Series(s) => s.primary_key.as_ref(),
149		}
150	}
151
152	pub fn sort(&self) -> &[ViewSortKey] {
153		match self {
154			View::Table(t) => &t.sort,
155			View::RingBuffer(rb) => &rb.sort,
156			View::Series(s) => &s.sort,
157		}
158	}
159
160	pub fn storage_kind(&self) -> ViewStorageKind {
161		match self {
162			View::Table(_) => ViewStorageKind::Table,
163			View::RingBuffer(_) => ViewStorageKind::RingBuffer,
164			View::Series(_) => ViewStorageKind::Series,
165		}
166	}
167
168	pub fn storage_id(&self) -> StorageId {
169		match self {
170			View::Table(t) => StorageId::Table(t.storage),
171			View::RingBuffer(rb) => StorageId::RingBuffer(rb.storage),
172			View::Series(s) => StorageId::Series(s.storage),
173		}
174	}
175
176	pub fn set_name(&mut self, new_name: String) {
177		match self {
178			View::Table(t) => t.name = new_name,
179			View::RingBuffer(rb) => rb.name = new_name,
180			View::Series(s) => s.name = new_name,
181		}
182	}
183
184	pub fn set_namespace(&mut self, new_namespace: NamespaceId) {
185		match self {
186			View::Table(t) => t.namespace = new_namespace,
187			View::RingBuffer(rb) => rb.namespace = new_namespace,
188			View::Series(s) => s.namespace = new_namespace,
189		}
190	}
191}