Skip to main content

sql_fun_sqlast/sem/
view_like.rs

1use crate::sem::{
2    AlterView, AnalysisError, ColumnDefinition, ColumnName, CreateTableAs, CreateView,
3};
4
5/// view like object
6#[derive(Debug, Clone)]
7pub enum ViewLike {
8    /// normal view
9    View(Box<CreateView>),
10    /// materialized view
11    MaterializedView(CreateTableAs),
12}
13
14impl ViewLike {
15    /// apply alter view statement
16    ///
17    /// # Errors
18    ///
19    /// - `AnalysisError`
20    pub fn apply_alter(&mut self, alter_view: &AlterView) -> Result<(), AnalysisError> {
21        match self {
22            Self::View(create_view) => create_view.apply_alter(alter_view),
23            Self::MaterializedView(create_table_as) => create_table_as.apply_alter(alter_view),
24        }
25    }
26
27    /// get column definition by column name
28    #[must_use]
29    pub fn get_column_def(&self, column_name: &ColumnName) -> Option<ColumnDefinition> {
30        match self {
31            Self::View(create_view) => create_view.get_column_def(column_name),
32            Self::MaterializedView(create_table_as) => create_table_as.get_column_def(column_name),
33        }
34    }
35
36    /// return true if column exist
37    #[must_use]
38    pub fn has_column(&self, column_name: &ColumnName) -> bool {
39        match self {
40            Self::View(create_view) => create_view.has_column(column_name),
41            Self::MaterializedView(cta) => cta.has_column(column_name),
42        }
43    }
44
45    /// check view is materialized
46    #[must_use]
47    pub fn is_materialized(&self) -> bool {
48        matches!(self, Self::MaterializedView(_))
49    }
50}
51
52impl From<&CreateView> for ViewLike {
53    fn from(value: &CreateView) -> Self {
54        Self::View(Box::new(value.clone()))
55    }
56}
57
58impl From<&CreateTableAs> for ViewLike {
59    fn from(value: &CreateTableAs) -> Self {
60        Self::MaterializedView(value.clone())
61    }
62}