001package gudusoft.gsqlparser.stmt;
002
003import gudusoft.gsqlparser.EDbVendor;
004import gudusoft.gsqlparser.ESqlStatementType;
005import gudusoft.gsqlparser.TCustomSqlStatement;
006import gudusoft.gsqlparser.nodes.*;
007import gudusoft.gsqlparser.nodes.flink.TFlinkTableProperty;
008
009/**
010 * SUBMIT TASK statement for StarRocks.
011 *
012 * Syntax:
013 * SUBMIT TASK [task_name]
014 *   [SCHEDULE [START(<schedule_start>)] EVERY(INTERVAL <schedule_interval>)]
015 *   [PROPERTIES ("key" = "value"[, ...])]
016 *   AS <etl_statement>
017 *
018 * Supported ETL statements:
019 *   - CREATE TABLE AS SELECT (from v3.0)
020 *   - INSERT (from v3.0)
021 *   - CACHE SELECT (from v3.3)
022 */
023public class TSubmitTaskStmt extends TCustomSqlStatement {
024
025    // Task identification (optional)
026    private TObjectName taskName;
027
028    // Schedule options
029    private boolean hasSchedule;
030    private String scheduleStart;
031    private String scheduleInterval;
032
033    // Properties (PROPERTIES clause)
034    private TPTNodeList<TFlinkTableProperty> taskProperties;
035
036    // Inner ETL statement
037    private TCustomSqlStatement innerStatement;
038
039    public TSubmitTaskStmt(EDbVendor dbvendor) {
040        super(dbvendor);
041        sqlstatementtype = ESqlStatementType.sststarrocksSubmitTask;
042    }
043
044    // Getters
045    public TObjectName getTaskName() {
046        return taskName;
047    }
048
049    public boolean hasSchedule() {
050        return hasSchedule;
051    }
052
053    public String getScheduleStart() {
054        return scheduleStart;
055    }
056
057    public String getScheduleInterval() {
058        return scheduleInterval;
059    }
060
061    public TPTNodeList<TFlinkTableProperty> getTaskProperties() {
062        return taskProperties;
063    }
064
065    public TCustomSqlStatement getInnerStatement() {
066        return innerStatement;
067    }
068
069    @Override
070    public int doParseStatement(TCustomSqlStatement psql) {
071        if (rootNode == null) return -1;
072        super.doParseStatement(psql);
073
074        TSubmitTaskSqlNode node = (TSubmitTaskSqlNode) rootNode;
075
076        this.taskName = node.getTaskName();
077        this.hasSchedule = node.hasSchedule();
078
079        if (node.getScheduleStart() != null) {
080            this.scheduleStart = node.getScheduleStart().toString();
081        }
082
083        if (node.getScheduleInterval() != null) {
084            this.scheduleInterval = node.getScheduleInterval().toString();
085        }
086
087        this.taskProperties = node.getTaskProperties();
088
089        // Parse the inner statement
090        if (node.getInnerStatement() != null) {
091            TParseTreeNode innerNode = node.getInnerStatement();
092            // The inner statement will be parsed separately by the parser
093            // We store the reference to the parsed statement
094            if (innerNode instanceof TCustomSqlStatement) {
095                this.innerStatement = (TCustomSqlStatement) innerNode;
096            }
097        }
098
099        return 0;
100    }
101
102    @Override
103    public void accept(TParseTreeVisitor v) {
104        v.preVisit(this);
105        v.postVisit(this);
106    }
107
108    @Override
109    public void acceptChildren(TParseTreeVisitor v) {
110        v.preVisit(this);
111        if (innerStatement != null) {
112            innerStatement.acceptChildren(v);
113        }
114        v.postVisit(this);
115    }
116}