use reifydb_type::value::r#type::Type;
use serde::{Deserialize, Serialize};
use crate::{
common::CommitVersion,
encoded::schema::{RowSchema, RowSchemaField},
interface::catalog::{
id::{NamespaceId, SubscriptionColumnId, SubscriptionId},
key::PrimaryKey,
},
};
pub const IMPLICIT_COLUMN_OP: &str = "_op";
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SubscriptionColumn {
pub id: SubscriptionColumnId,
pub name: String,
pub ty: Type,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Subscription {
pub id: SubscriptionId,
pub columns: Vec<SubscriptionColumn>,
pub primary_key: Option<PrimaryKey>,
pub acknowledged_version: CommitVersion,
}
impl Subscription {
pub fn implicit_columns() -> Vec<SubscriptionColumn> {
vec![SubscriptionColumn {
id: SubscriptionColumnId(u64::MAX - 2), name: IMPLICIT_COLUMN_OP.to_string(),
ty: Type::Uint1, }]
}
pub fn all_columns(&self) -> Vec<SubscriptionColumn> {
let mut all = self.columns.clone();
all.extend(Self::implicit_columns());
all
}
}
impl From<&Subscription> for RowSchema {
fn from(value: &Subscription) -> Self {
let fields = value
.columns
.iter()
.map(|col| RowSchemaField::unconstrained(col.name.clone(), col.ty.clone()))
.collect();
RowSchema::new(fields)
}
}
pub fn subscription_flow_name(id: SubscriptionId) -> String {
format!("subscription_{}", id.0)
}
pub const fn subscription_flow_namespace() -> NamespaceId {
NamespaceId::SYSTEM
}