001package gudusoft.gsqlparser.nodes.snowflake;
002
003
004import gudusoft.gsqlparser.nodes.TConstant;
005import gudusoft.gsqlparser.nodes.TExpression;
006import gudusoft.gsqlparser.nodes.TParseTreeNode;
007import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
008
009/**
010 * Snowflake Time Travel SQL extensions
011 * https://docs.snowflake.com/en/user-guide/data-time-travel
012 *
013 * The clause uses one of the following parameters to pinpoint the exact historical data you want to access:
014 *
015 * <br>TIMESTAMP
016 *
017 * <br>OFFSET (time difference in seconds from the present time)
018 *
019 * <br>STATEMENT (query ID for statement)
020 */
021public class TAtBeforeClause  extends TParseTreeNode {
022    public enum TimeTravelType {
023        TIMESTAMP,
024        OFFSET,
025        STATEMENT
026    }
027
028    public enum ClauseType {
029        AT,
030        BEFORE
031    }
032
033    private ClauseType clauseType; // Distinguishes between AT and BEFORE
034    private TimeTravelType type; // Type of Time Travel
035    private TExpression timestamp; // For TIMESTAMP type
036    private TExpression offset; // For OFFSET type
037    private TConstant statementId; // For STATEMENT type
038
039
040    public void init(Object arg1, Object arg2) {
041        clauseType = (ClauseType) arg1;
042        type = (TimeTravelType) arg2;
043    }
044
045    public void init(Object arg1, Object arg2, Object arg3) {
046        init(arg1, arg2);
047        switch (type) {
048            case TIMESTAMP:
049                timestamp = (TExpression) arg3;
050                break;
051            case OFFSET:
052                offset = (TExpression) arg3;
053                break;
054            case STATEMENT:
055                statementId = (TConstant) arg3;
056                break;
057        }
058    }
059
060    public ClauseType getClauseType() {
061        return clauseType;
062    }
063
064    public TimeTravelType getType() {
065        return type;
066    }
067
068    public TExpression getTimestamp() {
069        return timestamp;
070    }
071
072    public TExpression getOffset() {
073        return offset;
074    }
075
076    public TConstant getStatementId() {
077        return statementId;
078    }
079
080
081    public void accept(TParseTreeVisitor v)
082    {
083        v.preVisit(this);
084        v.postVisit(this);
085    }
086
087    public void acceptChildren(TParseTreeVisitor v) {
088        v.preVisit(this);
089        v.postVisit(this);
090    }
091}