001package gudusoft.gsqlparser.stmt;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.nodes.*;
005import gudusoft.gsqlparser.nodes.oracle.TMaterializedViewProps;
006import gudusoft.gsqlparser.nodes.oracle.TOracleCreateMvRefresh;
007import gudusoft.gsqlparser.nodes.oracle.TOracleUsingIndex;
008import gudusoft.gsqlparser.nodes.oracle.TPhysicalProperties;
009import gudusoft.gsqlparser.nodes.redshift.TRedshiftTableAttributes;
010import java.util.List;
011
012public class TCreateMaterializedSqlStatement extends TCustomSqlStatement {
013    private TSelectSqlStatement subquery = null;
014    private TViewAliasClause viewAliasClause = null;
015    private boolean forUpdate = false;
016    private TOracleUsingIndex oracleUsingIndex;
017    private TOracleCreateMvRefresh mvRefresh;
018    
019    private List<TRedshiftTableAttributes> tableAttributes;
020    public void setTableAttributes(List<TRedshiftTableAttributes> tableAttributes) {
021        this.tableAttributes = tableAttributes;
022    }
023
024    public List<TRedshiftTableAttributes> getTableAttributes() {
025        return tableAttributes;
026    }
027
028
029    public TOracleCreateMvRefresh getMvRefresh() {
030        return mvRefresh;
031    }
032
033    /**
034     * Using index clause
035     * @return using index clause
036     */
037    public TOracleUsingIndex getOracleUsingIndex() {
038        return oracleUsingIndex;
039    }
040
041    /**
042     * For update clause is specified if the value is true.
043     * @return whether for update clause is true
044     */
045    public boolean isForUpdate() {
046        return forUpdate;
047    }
048
049    public TViewAliasClause getViewAliasClause() {
050        return viewAliasClause;
051    }
052
053    /**
054     *
055     * @return   a subquery that identifies columns and rows of the table(s) that the view is based on.
056     */
057    public TSelectSqlStatement getSubquery() {
058        return subquery;
059    }
060
061    public TCreateMaterializedSqlStatement(EDbVendor dbvendor) {
062        super(dbvendor);
063        sqlstatementtype = ESqlStatementType.sstcreatematerializedview;
064    }
065
066    private TObjectName viewName = null;
067
068    /**
069     *
070     * @return the name of the view or the object view.
071     */
072    public TObjectName getViewName() {
073        return viewName;
074    }
075
076    private TPhysicalProperties physicalProperties;
077
078    public TPhysicalProperties getPhysicalProperties() {
079        return physicalProperties;
080    }
081
082    public TMaterializedViewProps getMaterializedViewProps() {
083        return materializedViewProps;
084    }
085
086    private TMaterializedViewProps materializedViewProps;
087
088    public int doParseStatement(TCustomSqlStatement psql) {
089        if (rootNode == null) return -1;
090
091        // Handle AS REPLICA OF case (BigQuery) - grammar produces TDummy with view name in node1
092        if (rootNode instanceof TDummy){
093            super.doParseStatement(psql);
094            TDummy dummy = (TDummy)rootNode;
095            if (dummy.node1 instanceof TObjectName){
096                this.viewName = (TObjectName)dummy.node1;
097            }
098            return 0;
099        }
100
101        TCreateMaterializedViewSqlNode createViewSqlNode = (TCreateMaterializedViewSqlNode)rootNode;
102        super.doParseStatement(psql);
103        this.viewName = createViewSqlNode.getViewName();
104        if (getSqlEnv().getDefaultCatalogName() != null){
105            if (viewName.getDatabaseToken() == null){
106                viewName.setDatabaseToken(new TSourceToken(getSqlEnv().getDefaultCatalogName()));
107            }
108        }
109        oracleUsingIndex = createViewSqlNode.getOracleUsingIndex();
110        mvRefresh = createViewSqlNode.getMvRefresh();
111        physicalProperties = createViewSqlNode.getPhysicalProperties();
112        materializedViewProps = createViewSqlNode.getMaterializedViewProps();
113        forUpdate = createViewSqlNode.isForUpdate();
114        tableAttributes = createViewSqlNode.getTableAttributes();
115
116
117        subquery = new TSelectSqlStatement(this.dbvendor);
118        subquery.rootNode = createViewSqlNode.getSelectSqlNode();
119        subquery.doParseStatement(this);
120
121        if (createViewSqlNode.getViewAliasClause() != null){
122            createViewSqlNode.getViewAliasClause().doParse(this, ESqlClause.viewAlias);
123            this.viewAliasClause = createViewSqlNode.getViewAliasClause();
124        }
125
126        return 0;
127    }
128
129    public void accept(TParseTreeVisitor v){
130        v.preVisit(this);
131        v.postVisit(this);
132    }
133
134    public void acceptChildren(TParseTreeVisitor v){
135        v.preVisit(this);
136        subquery.acceptChildren(v);
137        if (viewAliasClause != null) viewAliasClause.acceptChildren(v);
138        v.postVisit(this);
139    }
140
141    public void setSubquery(TSelectSqlStatement subquery) {
142        this.subquery = subquery;
143    }
144
145    public void setViewAliasClause(TViewAliasClause viewAliasClause) {
146        this.viewAliasClause = viewAliasClause;
147    }
148
149    public void setViewName(TObjectName viewName) {
150        this.viewName = viewName;
151    }
152}