reifydb_core/interface/catalog/
subscription.rs1use reifydb_type::value::r#type::Type;
5use serde::{Deserialize, Serialize};
6
7use crate::{
8 common::CommitVersion,
9 encoded::schema::{Schema, SchemaField},
10 interface::catalog::{
11 id::{NamespaceId, SubscriptionColumnId, SubscriptionId},
12 key::PrimaryKeyDef,
13 },
14};
15
16pub const IMPLICIT_COLUMN_OP: &str = "_op";
18
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
22pub struct SubscriptionColumnDef {
23 pub id: SubscriptionColumnId,
24 pub name: String,
25 pub ty: Type,
26}
27
28#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
29pub struct SubscriptionDef {
30 pub id: SubscriptionId,
31 pub columns: Vec<SubscriptionColumnDef>,
33 pub primary_key: Option<PrimaryKeyDef>,
34 pub acknowledged_version: CommitVersion,
35}
36
37impl SubscriptionDef {
38 pub fn implicit_columns() -> Vec<SubscriptionColumnDef> {
40 vec![SubscriptionColumnDef {
41 id: SubscriptionColumnId(u64::MAX - 2), name: IMPLICIT_COLUMN_OP.to_string(),
43 ty: Type::Uint1, }]
45 }
46
47 pub fn all_columns(&self) -> Vec<SubscriptionColumnDef> {
49 let mut all = self.columns.clone();
50 all.extend(Self::implicit_columns());
51 all
52 }
53}
54
55impl From<&SubscriptionDef> for Schema {
56 fn from(value: &SubscriptionDef) -> Self {
57 let fields = value
59 .columns
60 .iter()
61 .map(|col| SchemaField::unconstrained(col.name.clone(), col.ty.clone()))
62 .collect();
63 Schema::new(fields)
64 }
65}
66
67pub fn subscription_flow_name(id: SubscriptionId) -> String {
70 format!("subscription_{}", id.0)
71}
72
73pub const fn subscription_flow_namespace() -> NamespaceId {
75 NamespaceId(1)
76}