sql_fun_sqlast/sem/schema_file_context/
view_info.rs1use 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}