Skip to main content

sql_fun_sqlast/sem/schema_file_context/
view_info.rs

1use crate::{
2    TrieMap,
3    sem::{
4        AlterView, AnalysisError, AnalysisProblem, BaseParseContext, CreateTableAs, CreateView,
5        FullName, ViewInfoRead, ViewInfoWrite, ViewLike,
6    },
7    syn::ObjectType,
8};
9
10use super::SchemaFileContext;
11
12#[derive(Debug, Default)]
13pub struct ViewInformationCollection(TrieMap<ViewLike>);
14
15impl ViewInformationCollection {
16    fn get(&self, key: &FullName) -> Option<&ViewLike> {
17        self.0.get(&key.to_string())
18    }
19
20    fn insert(&mut self, key: &FullName, value: &ViewLike) {
21        self.0.insert(&key.to_string(), value.clone());
22    }
23}
24
25impl<TBaseContext> ViewInfoRead for SchemaFileContext<TBaseContext>
26where
27    TBaseContext: BaseParseContext + std::fmt::Debug,
28{
29    fn get_view_impl(&self, key: &FullName) -> Option<&ViewLike> {
30        if let Some(v) = self.views.get(key) {
31            Some(v)
32        } else {
33            self.base.get_view_impl(key)
34        }
35    }
36}
37
38impl<TBaseContext> ViewInfoWrite for SchemaFileContext<TBaseContext>
39where
40    TBaseContext: BaseParseContext + std::fmt::Debug,
41{
42    #[tracing::instrument(skip(self))]
43    fn apply_alter_view(mut self, alter_view: &AlterView) -> Result<Self, AnalysisError>
44    where
45        Self: Sized,
46    {
47        let view_name = alter_view.view();
48        let Some(mut view) = self.get_view(view_name).cloned() else {
49            self.report_problem(AnalysisProblem::view_not_found(view_name))?;
50            return Ok(self);
51        };
52
53        view.apply_alter(alter_view)?;
54        self.views.insert(view_name.full_name(), &view);
55        Ok(self)
56    }
57
58    fn apply_create_table_as(
59        mut self,
60        create_table_as: &CreateTableAs,
61    ) -> Result<Self, AnalysisError> {
62        let name = create_table_as.name();
63        match create_table_as.obj_type() {
64            ObjectType::ObjectMatview => {
65                self.views.insert(name, &ViewLike::from(create_table_as));
66                Ok(self)
67            }
68            _ => {
69                todo!()
70            }
71        }
72    }
73
74    #[tracing::instrument(skip(self))]
75    fn apply_create_view(mut self, create_view: &CreateView) -> Result<Self, AnalysisError> {
76        let name = create_view.name();
77        self.views.insert(name, &ViewLike::from(create_view));
78        Ok(self)
79    }
80}