001package gudusoft.gsqlparser.stmt;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.nodes.*;
005import gudusoft.gsqlparser.sqlenv.TSQLEnv;
006import gudusoft.gsqlparser.sqlenv.TSQLTable;
007
008/**
009 * Define a view, which is a logical table based on one or more tables or views.
010 */
011
012public class TCreateViewSqlStatement extends TCustomSqlStatement {
013    private boolean isSecure  = false;
014    private boolean isRecursive = false;
015    private ETableKind tableKind = ETableKind.etkBase;
016
017    public boolean isSecure() {
018        return isSecure;
019    }
020
021    public boolean isRecursive() {
022        return isRecursive;
023    }
024
025    public ETableKind getTableKind() {
026        return tableKind;
027    }
028
029    public TObjectName getComment(){
030        if (commentClause == null) return null;
031        if (commentClause.getComment() == null) return null;
032        return commentClause.getComment();
033    }
034    private TCreateTableOption commentClause;
035
036//    public TCreateTableOption getCommentClause() {
037//        return commentClause;
038//    }
039
040    private TSelectSqlStatement subquery = null;
041    private TViewAliasClause viewAliasClause = null;
042    private TSourceToken stForce = null;
043    private TSourceToken stReplace = null;
044    private TObjectNameList viewAttributeList;
045    private boolean isForce = false;
046    private boolean isNoForce = false;
047
048    public void setForce(boolean isForce) {
049        this.isForce = isForce;
050    }
051
052    public void setNoForce(boolean isNoForce) {
053        this.isNoForce = isNoForce;
054    }
055
056    public boolean isForce() {
057
058        return isForce;
059    }
060
061    public boolean isNoForce() {
062        return isNoForce;
063    }
064
065    public void setViewAttributeList(TObjectNameList viewAttributeList) {
066        this.viewAttributeList = viewAttributeList;
067    }
068
069    public TObjectNameList getViewAttributeList() {
070
071        return viewAttributeList;
072    }
073
074    public void setSubquery(TSelectSqlStatement subquery) {
075        this.subquery = subquery;
076    }
077
078    public void setViewAliasClause(TViewAliasClause viewAliasClause) {
079        this.viewAliasClause = viewAliasClause;
080    }
081
082    public void setStForce(TSourceToken stForce) {
083        this.stForce = stForce;
084    }
085
086    public void setStReplace(TSourceToken stReplace) {
087        this.stReplace = stReplace;
088    }
089
090    public void setRowTypeName(TObjectName rowTypeName) {
091        this.rowTypeName = rowTypeName;
092    }
093
094    public void setRestrictionClause(TRestrictionClause restrictionClause) {
095        this.restrictionClause = restrictionClause;
096    }
097
098    public void setViewName(TObjectName viewName) {
099        this.viewName = viewName;
100    }
101
102    private TObjectName rowTypeName;
103
104    public TObjectName getRowTypeName() {
105        return rowTypeName;
106    }
107
108    public TSourceToken getStForce() {
109        return stForce;
110    }
111
112    public TSourceToken getStReplace() {
113        return stReplace;
114    }
115
116    /**
117     * Oracle, DB2 restriction clause
118     * @return DB2 restriction clause
119     */
120    public TRestrictionClause getRestrictionClause() {
121        return restrictionClause;
122    }
123
124    private TRestrictionClause restrictionClause = null;
125
126
127    public TViewAliasClause getViewAliasClause() {
128        return viewAliasClause;
129    }
130
131    public TCreateViewSqlStatement(EDbVendor dbvendor) {
132        super(dbvendor);
133        sqlstatementtype = ESqlStatementType.sstcreateview;
134    }
135
136    /**
137     * 
138     * @return   a subquery that identifies columns and rows of the table(s) that the view is based on.
139     */
140    public TSelectSqlStatement getSubquery() {
141        return subquery;
142    }
143
144    void buildsql() {
145    }
146
147    void clear() {
148    }
149
150    String getasprettytext() {
151        return "";
152    }
153
154    void iterate(TVisitorAbs pvisitor) {
155    }
156
157    public int doParseStatement(TCustomSqlStatement psql) {
158        if (rootNode == null) return -1;
159        TCreateViewSqlNode createViewSqlNode = (TCreateViewSqlNode)rootNode;
160        super.doParseStatement(psql);
161        this.viewName = createViewSqlNode.getViewName();
162        this.viewName.setDbObjectType(EDbObjectType.view);
163        this.isSecure = createViewSqlNode.isSecure();
164        this.isRecursive = createViewSqlNode.isRecursive();
165        this.tableKind = createViewSqlNode.getTableKind();
166        this.viewName.setTableKind(this.tableKind);
167
168        TSQLTable sqlView = null;
169        if (getSqlEnv() != null)  {
170            sqlView = getSqlEnv().addView(viewName.toString(),true);
171
172//            if (getSqlEnv().getDefaultCatalogName() != null){
173//                if (this.viewName.getDatabaseToken() == null){
174//                    this.viewName.setDatabaseToken(new TSourceToken(getSqlEnv().getDefaultCatalogName()));
175//                }
176//            }
177
178            this.viewName.setSqlEnv(getSqlEnv());
179        }
180        rowTypeName = createViewSqlNode.getRowTypeName();
181
182        if (createViewSqlNode.getSelectSqlNode() != null) {
183            // gaussdb create view using jdbc option does not support subquery
184            // https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0197.html
185            subquery = new TSelectSqlStatement(this.dbvendor);
186            subquery.rootNode = createViewSqlNode.getSelectSqlNode();
187            subquery.doParseStatement(this);
188        }
189
190        if (createViewSqlNode.getViewAliasClause() != null){
191            createViewSqlNode.getViewAliasClause().doParse(this, ESqlClause.viewAlias);
192            this.viewAliasClause = createViewSqlNode.getViewAliasClause();
193            if (sqlView != null){
194                for(int i=0;i<viewAliasClause.getViewAliasItemList().size();i++){
195                    TViewAliasItem item = viewAliasClause.getViewAliasItemList().getViewAliasItem(i);
196                    if (item.getAlias() != null){
197                        sqlView.addColumn(item.getAlias().toString());
198                    }
199                }
200            }
201        }else{
202            if ((sqlView != null)&&(subquery != null)) {
203                TSelectSqlStatement viewQuery = subquery;
204                if (subquery.isCombinedQuery()){
205                    viewQuery = subquery.getRightStmt();
206                }
207                viewQuery.addColumnInSelectListToSQLEnv(sqlView);
208//                for(int i=0;i<viewQuery.getResultColumnList().size();i++){
209//                    TResultColumn resultColumn = viewQuery.getResultColumnList().getResultColumn(i);
210//                    String aliasName = null;
211//                    if (resultColumn.getAliasClause() != null){
212//                        aliasName = resultColumn.getAliasClause().getAliasName().toString();
213//                    }else{
214//                        if (resultColumn.getExpr().getObjectOperand() != null){
215//                            aliasName = resultColumn.getExpr().getObjectOperand().toString();
216//                        }
217//                    }
218//                    if (aliasName != null){
219//                        sqlView.addColumn(TSQLEnv.getObjectName(aliasName));
220//                    }
221//                }
222            }
223        }
224
225        this.restrictionClause = createViewSqlNode.getRestrictionClause();
226        this.stForce = createViewSqlNode.getStForce();
227        isForce = createViewSqlNode.isForce();
228        isNoForce = createViewSqlNode.isNoForce();
229        this.stReplace = createViewSqlNode.getStReplace();
230        viewAttributeList = createViewSqlNode.getViewAttributeList();
231        this.commentClause = createViewSqlNode.getCommentClause();
232
233        return 0;
234    }
235
236    private TObjectName viewName = null;
237
238    /**
239     *
240     * @return the name of the view or the object view.
241     */
242    public TObjectName getViewName() {
243        return viewName;
244    }
245
246    public void accept(TParseTreeVisitor v){
247        v.preVisit(this);
248        v.postVisit(this);
249    }
250
251    public void acceptChildren(TParseTreeVisitor v){
252        v.preVisit(this);
253        if (viewAliasClause != null) viewAliasClause.acceptChildren(v);
254        if(subquery != null){
255            subquery.acceptChildren(v);
256        }
257
258        if (restrictionClause != null) restrictionClause.acceptChildren(v);
259        v.postVisit(this);
260    }
261}