001package gudusoft.gsqlparser.stmt.snowflake;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.nodes.TCreateTableOption;
005import gudusoft.gsqlparser.nodes.TObjectName;
006import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
007import gudusoft.gsqlparser.nodes.snowflake.*;
008
009/**
010 * Snowflake CREATE SEMANTIC VIEW statement.
011 *
012 * @see <a href="https://docs.snowflake.com/en/sql-reference/sql/create-semantic-view">
013 *      Snowflake CREATE SEMANTIC VIEW</a>
014 */
015public class TCreateSemanticViewStmt extends TCustomSqlStatement {
016
017    private TObjectName viewName;
018    private TSemanticViewClause tablesClause;
019    private TSemanticViewClause relationshipsClause;
020    private TSemanticViewClause factsClause;
021    private TSemanticViewClause dimensionsClause;
022    private TSemanticViewClause metricsClause;
023    private TObjectName comment;
024
025    public TCreateSemanticViewStmt(EDbVendor dbvendor) {
026        super(dbvendor);
027        sqlstatementtype = ESqlStatementType.sstcreatesemanticview;
028    }
029
030    public TObjectName getViewName() {
031        return viewName;
032    }
033
034    public TSemanticViewClause getTablesClause() {
035        return tablesClause;
036    }
037
038    public TSemanticViewClause getRelationshipsClause() {
039        return relationshipsClause;
040    }
041
042    public TSemanticViewClause getFactsClause() {
043        return factsClause;
044    }
045
046    public TSemanticViewClause getDimensionsClause() {
047        return dimensionsClause;
048    }
049
050    public TSemanticViewClause getMetricsClause() {
051        return metricsClause;
052    }
053
054    public TObjectName getComment() {
055        return comment;
056    }
057
058    @Override
059    public int doParseStatement(TCustomSqlStatement psql) {
060        if (rootNode == null) return -1;
061        super.doParseStatement(psql);
062
063        TCreateSemanticViewSqlNode node = (TCreateSemanticViewSqlNode) rootNode;
064        viewName = node.getViewName();
065        if (viewName != null) {
066            viewName.setDbObjectType(EDbObjectType.view);
067        }
068
069        // Extract each clause from the list
070        tablesClause = node.getTablesClause();
071        relationshipsClause = node.getRelationshipsClause();
072        factsClause = node.getFactsClause();
073        dimensionsClause = node.getDimensionsClause();
074        metricsClause = node.getMetricsClause();
075
076        // Extract comment from commentClause
077        TCreateTableOption commentOption = node.getCommentClause();
078        if (commentOption != null) {
079            comment = commentOption.getComment();
080        }
081
082        return 0;
083    }
084
085    @Override
086    public void accept(TParseTreeVisitor v) {
087        v.preVisit(this);
088        v.postVisit(this);
089    }
090
091    @Override
092    public void acceptChildren(TParseTreeVisitor v) {
093        v.preVisit(this);
094        if (viewName != null) {
095            viewName.accept(v);
096        }
097        if (tablesClause != null) {
098            tablesClause.accept(v);
099        }
100        if (relationshipsClause != null) {
101            relationshipsClause.accept(v);
102        }
103        if (factsClause != null) {
104            factsClause.accept(v);
105        }
106        if (dimensionsClause != null) {
107            dimensionsClause.accept(v);
108        }
109        if (metricsClause != null) {
110            metricsClause.accept(v);
111        }
112        if (comment != null) {
113            comment.accept(v);
114        }
115        v.postVisit(this);
116    }
117}