use crate::data_type::DataType;
use crate::storage_strategy::StoragePlan;
#[derive(Debug, Clone, Copy)]
pub struct EntityRef<'a> {
pub schema: Option<&'a str>,
pub name: &'a str,
pub is_identity_table: bool,
pub columns: &'a [&'a str],
pub partition_column_type: Option<&'a DataType>,
}
#[derive(Debug, Clone, Copy)]
pub struct SliceRef<'a> {
pub column: &'a str,
pub value: &'a str,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SliceReplacement {
Emptied(Vec<String>),
WrittenByInsert(String),
}
#[derive(Debug, Clone, Copy)]
pub struct RetainedCompanion<'a> {
pub table: EntityRef<'a>,
pub slice_column: &'a str,
}
pub trait StorageRenderer {
#[must_use]
fn render_partition_function(
&self,
_entity: EntityRef<'_>,
_plan: &StoragePlan,
) -> Vec<String> {
Vec::new()
}
#[must_use]
fn render_partition_scheme(&self, _entity: EntityRef<'_>, _plan: &StoragePlan) -> Vec<String> {
Vec::new()
}
#[must_use]
fn render_table_storage_clause(
&self,
_entity: EntityRef<'_>,
_plan: &StoragePlan,
) -> Option<String> {
None
}
#[must_use]
fn render_post_create_storage(
&self,
_entity: EntityRef<'_>,
_plan: &StoragePlan,
) -> Vec<String> {
Vec::new()
}
#[must_use]
fn render_partition_extend_procedure(
&self,
_entity: EntityRef<'_>,
_plan: &StoragePlan,
) -> Option<String> {
None
}
#[must_use]
fn render_partition_retain_procedure(
&self,
_entity: EntityRef<'_>,
_plan: &StoragePlan,
_also: Option<RetainedCompanion<'_>>,
) -> Option<String> {
None
}
#[must_use]
fn partition_extend_call_before_write(
&self,
_entity: EntityRef<'_>,
_plan: &StoragePlan,
) -> Option<String> {
None
}
#[must_use]
fn render_slice_replacement(
&self,
_entity: EntityRef<'_>,
_plan: &StoragePlan,
_slice: SliceRef<'_>,
) -> Option<SliceReplacement> {
None
}
}
#[cfg(test)]
mod tests {
use super::*;
struct DefaultRenderer;
impl StorageRenderer for DefaultRenderer {}
fn entity() -> EntityRef<'static> {
EntityRef {
schema: Some("core"),
name: "events",
is_identity_table: false,
columns: &[],
partition_column_type: None,
}
}
#[test]
fn defaults_produce_no_sql() {
let r = DefaultRenderer;
let plan = StoragePlan::none();
assert!(r.render_partition_function(entity(), &plan).is_empty());
assert!(r.render_partition_scheme(entity(), &plan).is_empty());
assert!(r.render_table_storage_clause(entity(), &plan).is_none());
assert!(r.render_post_create_storage(entity(), &plan).is_empty());
assert!(r.render_partition_extend_procedure(entity(), &plan).is_none());
assert!(r.render_partition_retain_procedure(entity(), &plan, None).is_none());
assert!(r.partition_extend_call_before_write(entity(), &plan).is_none());
assert!(
r.render_slice_replacement(
entity(),
&plan,
SliceRef { column: "day", value: "$p_slice" }
)
.is_none()
);
}
}