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