1 /*
2  * Copyright 2015-2018 HuntLabs.cn
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 module hunt.sql.ast.statement.SQLCreateViewStatement;
17 
18 
19 import hunt.collection;
20 
21 import hunt.sql.SQLUtils;
22 import hunt.sql.ast;
23 import hunt.sql.ast.expr.SQLCharExpr;
24 import hunt.sql.ast.expr.SQLIdentifierExpr;
25 import hunt.sql.ast.expr.SQLLiteralExpr;
26 import hunt.sql.ast.expr.SQLPropertyExpr;
27 import hunt.sql.visitor.SQLASTVisitor;
28 import hunt.sql.ast.statement.SQLTableElement;
29 import hunt.sql.ast.statement.SQLExprTableSource;
30 import hunt.sql.ast.statement.SQLSelect;
31 import hunt.sql.ast.statement.SQLCreateStatement;
32 
33 public class SQLCreateViewStatement : SQLStatementImpl , SQLCreateStatement {
34 
35     private bool     orReplace   = false;
36     private bool     force       = false;
37     // protected SQLName   name;
38     protected SQLSelect subQuery;
39     protected bool   ifNotExists = false;
40 
41     protected string    algorithm;
42     protected SQLName   definer;
43     protected string    sqlSecurity;
44 
45     protected SQLExprTableSource tableSource;
46 
47     protected  List!SQLTableElement columns;
48 
49     private bool withCheckOption;
50     private bool withCascaded;
51     private bool withLocal;
52     private bool withReadOnly;
53 
54     private SQLLiteralExpr comment;
55 
56     public this(){
57         columns = new ArrayList!SQLTableElement();
58     }
59 
60     public this(string dbType){
61         columns = new ArrayList!SQLTableElement();
62         super(dbType);
63     }
64 
65     public string computeName() {
66         if (tableSource is null) {
67             return null;
68         }
69 
70         SQLExpr expr = tableSource.getExpr();
71         if (cast(SQLName)(expr) !is null ) {
72             string name = (cast(SQLName) expr).getSimpleName();
73             return SQLUtils.normalize(name);
74         }
75 
76         return null;
77     }
78 
79     public string getSchema() {
80         SQLName name = getName();
81         if (name is null) {
82             return null;
83         }
84 
85         if (cast(SQLPropertyExpr)(name) !is null ) {
86             return (cast(SQLPropertyExpr) name).getOwnernName();
87         }
88 
89         return null;
90     }
91 
92     public bool isOrReplace() {
93         return orReplace;
94     }
95 
96     public void setOrReplace(bool orReplace) {
97         this.orReplace = orReplace;
98     }
99 
100     public SQLName getName() {
101         if (tableSource is null) {
102             return null;
103         }
104 
105         return cast(SQLName) tableSource.getExpr();
106     }
107 
108     public void setName(SQLName name) {
109         this.setTableSource(new SQLExprTableSource(name));
110     }
111 
112     public void setName(string name) {
113         this.setName(new SQLIdentifierExpr(name));
114     }
115 
116     public SQLExprTableSource getTableSource() {
117         return tableSource;
118     }
119 
120     public void setTableSource(SQLExprTableSource tableSource) {
121         if (tableSource !is null) {
122             tableSource.setParent(this);
123         }
124         this.tableSource = tableSource;
125     }
126 
127     public bool isWithCheckOption() {
128         return withCheckOption;
129     }
130 
131     public void setWithCheckOption(bool withCheckOption) {
132         this.withCheckOption = withCheckOption;
133     }
134 
135     public bool isWithCascaded() {
136         return withCascaded;
137     }
138 
139     public void setWithCascaded(bool withCascaded) {
140         this.withCascaded = withCascaded;
141     }
142 
143     public bool isWithLocal() {
144         return withLocal;
145     }
146 
147     public void setWithLocal(bool withLocal) {
148         this.withLocal = withLocal;
149     }
150 
151     public bool isWithReadOnly() {
152         return withReadOnly;
153     }
154 
155     public void setWithReadOnly(bool withReadOnly) {
156         this.withReadOnly = withReadOnly;
157     }
158 
159     public SQLSelect getSubQuery() {
160         return subQuery;
161     }
162 
163     public void setSubQuery(SQLSelect subQuery) {
164         if (subQuery !is null) {
165             subQuery.setParent(this);
166         }
167         this.subQuery = subQuery;
168     }
169 
170     public List!SQLTableElement getColumns() {
171         return columns;
172     }
173     
174     public void addColumn(SQLTableElement column) {
175         if (column !is null) {
176             column.setParent(this);
177         }
178         this.columns.add(column);
179     }
180 
181     public bool isIfNotExists() {
182         return ifNotExists;
183     }
184 
185     public void setIfNotExists(bool ifNotExists) {
186         this.ifNotExists = ifNotExists;
187     }
188 
189     public SQLLiteralExpr getComment() {
190         return comment;
191     }
192 
193     public void setComment(SQLLiteralExpr comment) {
194         if (comment !is null) {
195             comment.setParent(this);
196         }
197         this.comment = comment;
198     }
199 
200     public string getAlgorithm() {
201         return algorithm;
202     }
203 
204     public void setAlgorithm(string algorithm) {
205         this.algorithm = algorithm;
206     }
207 
208     public SQLName getDefiner() {
209         return definer;
210     }
211 
212     public void setDefiner(SQLName definer) {
213         if (definer !is null) {
214             definer.setParent(this);
215         }
216         this.definer = definer;
217     }
218 
219     public string getSqlSecurity() {
220         return sqlSecurity;
221     }
222 
223     public void setSqlSecurity(string sqlSecurity) {
224         this.sqlSecurity = sqlSecurity;
225     }
226 
227     public bool isForce() {
228         return force;
229     }
230 
231     public void setForce(bool force) {
232         this.force = force;
233     }
234 
235     
236     override  protected void accept0(SQLASTVisitor visitor) {
237         if (visitor.visit(this)) {
238             acceptChild(visitor, this.tableSource);
239             acceptChild!SQLTableElement(visitor, this.columns);
240             acceptChild(visitor, this.comment);
241             acceptChild(visitor, this.subQuery);
242         }
243         visitor.endVisit(this);
244     }
245 
246     override public List!SQLObject getChildren() {
247         List!SQLObject children = new ArrayList!SQLObject();
248         if (tableSource !is null) {
249             children.add(tableSource);
250         }
251         children.addAll(cast(List!SQLObject)(this.columns));
252         if (comment !is null) {
253             children.add(comment);
254         }
255         if (subQuery !is null) {
256             children.add(subQuery);
257         }
258         return children;
259     }
260 
261     public static enum Level {
262                               CASCADED, LOCAL
263     }
264 
265     public static class Column : SQLObjectImpl {
266 
267         private SQLExpr     expr;
268         private SQLCharExpr comment;
269 
270         public SQLExpr getExpr() {
271             return expr;
272         }
273 
274         public void setExpr(SQLExpr expr) {
275             if (expr !is null) {
276                 expr.setParent(this);
277             }
278             this.expr = expr;
279         }
280 
281         public SQLCharExpr getComment() {
282             return comment;
283         }
284 
285         public void setComment(SQLCharExpr comment) {
286             if (comment !is null) {
287                 comment.setParent(this);
288             }
289             this.comment = comment;
290         }
291 
292         
293         override  protected void accept0(SQLASTVisitor visitor) {
294             if (visitor.visit(this)) {
295                 acceptChild(visitor, expr);
296                 acceptChild(visitor, comment);
297             }
298         }
299     }
300 
301 
302     override public SQLCreateViewStatement clone() {
303         SQLCreateViewStatement x = new SQLCreateViewStatement();
304 
305         x.orReplace = orReplace;
306         x.force = force;
307         if (subQuery !is null) {
308             x.setSubQuery(subQuery.clone());
309         }
310         x.ifNotExists = ifNotExists;
311 
312         x.algorithm = algorithm;
313         if (definer !is null) {
314             x.setDefiner(definer.clone());
315         }
316         x.sqlSecurity = sqlSecurity;
317         if (tableSource !is null) {
318             x.setTableSource(tableSource.clone());
319         }
320         foreach (SQLTableElement column ; columns) {
321             SQLTableElement column2 = column.clone();
322             column2.setParent(x);
323             x.columns.add(column2);
324         }
325         x.withCheckOption = withCheckOption;
326         x.withCascaded = withCascaded;
327         x.withLocal = withLocal;
328         x.withReadOnly = withReadOnly;
329 
330         if (comment !is null) {
331             x.setComment(comment.clone());
332         }
333 
334         return x;
335     }
336 }