001package gudusoft.gsqlparser.stmt.bigquery;
002
003import gudusoft.gsqlparser.EDbVendor;
004import gudusoft.gsqlparser.ESqlStatementType;
005import gudusoft.gsqlparser.TCustomSqlStatement;
006import gudusoft.gsqlparser.nodes.TObjectName;
007import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
008import gudusoft.gsqlparser.nodes.bigquery.TCreateModelSqlNode;
009import gudusoft.gsqlparser.stmt.TSelectSqlStatement;
010
011/**
012 * BigQuery CREATE MODEL statement for machine learning.
013 * <p>
014 * Syntax:
015 * CREATE [OR REPLACE] MODEL [IF NOT EXISTS] model_name
016 * [TRANSFORM (transform_clause)]
017 * OPTIONS(options_list)
018 * AS query_statement
019 */
020public class TCreateModelSqlStatement extends TCustomSqlStatement {
021
022    public TCreateModelSqlStatement(EDbVendor dbvendor) {
023        super(dbvendor);
024        sqlstatementtype = ESqlStatementType.sstcreatemodel;
025    }
026
027    private TObjectName modelName;
028
029    /**
030     * Get the model name.
031     * @return the fully qualified model name
032     */
033    public TObjectName getModelName() {
034        return modelName;
035    }
036
037    private TSelectSqlStatement subQuery;
038
039    /**
040     * Get the AS query statement that provides training data.
041     * @return the SELECT statement providing training data
042     */
043    public TSelectSqlStatement getSubQuery() {
044        return subQuery;
045    }
046
047    public int doParseStatement(TCustomSqlStatement psql) {
048        if (rootNode == null) return -1;
049        super.doParseStatement(psql);
050        TCreateModelSqlNode createModelSqlNode = (TCreateModelSqlNode) rootNode;
051        this.modelName = createModelSqlNode.getModelName();
052
053        if (createModelSqlNode.getSelectSqlNode() != null) {
054            subQuery = new TSelectSqlStatement(this.dbvendor);
055            subQuery.rootNode = createModelSqlNode.getSelectSqlNode();
056            subQuery.doParseStatement(this);
057        }
058
059        return 0;
060    }
061
062    public void accept(TParseTreeVisitor v) {
063        v.preVisit(this);
064        v.postVisit(this);
065    }
066
067    public void acceptChildren(TParseTreeVisitor v) {
068        v.preVisit(this);
069        if (subQuery != null) {
070            subQuery.acceptChildren(v);
071        }
072        v.postVisit(this);
073    }
074}