001package gudusoft.gsqlparser.nodes.oceanbase;
002
003import gudusoft.gsqlparser.EDbObjectType;
004import gudusoft.gsqlparser.nodes.TObjectName;
005import gudusoft.gsqlparser.nodes.TParseTreeNode;
006import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
007
008/**
009 * AST node for OceanBase {@code FLASHBACK TABLE/DATABASE} statements.
010 *
011 * <p>Supports:
012 * <ul>
013 *   <li>{@code FLASHBACK TABLE name TO BEFORE DROP [RENAME TO new_name]}</li>
014 *   <li>{@code FLASHBACK DATABASE name TO BEFORE DROP}</li>
015 * </ul>
016 *
017 * @since 4.0.1.4
018 */
019public class TOceanbaseFlashbackSqlNode extends TParseTreeNode {
020
021    public enum EFlashbackType { TABLE, DATABASE, TENANT }
022
023    private EFlashbackType flashbackType;
024    private TObjectName objectName;
025    private TObjectName renameTo;
026
027    public EFlashbackType getFlashbackType() {
028        return flashbackType;
029    }
030
031    public void setFlashbackType(EFlashbackType flashbackType) {
032        this.flashbackType = flashbackType;
033    }
034
035    public TObjectName getObjectName() {
036        return objectName;
037    }
038
039    public void setObjectName(TObjectName objectName) {
040        this.objectName = objectName;
041        if (objectName != null) {
042            if (flashbackType == EFlashbackType.DATABASE) {
043                objectName.setDbObjectType(EDbObjectType.database);
044            } else if (flashbackType == EFlashbackType.TENANT) {
045                objectName.setDbObjectType(EDbObjectType.schema);
046            } else {
047                objectName.setDbObjectType(EDbObjectType.table);
048            }
049        }
050    }
051
052    public TObjectName getRenameTo() {
053        return renameTo;
054    }
055
056    public void setRenameTo(TObjectName renameTo) {
057        this.renameTo = renameTo;
058        if (renameTo != null) {
059            renameTo.setDbObjectType(EDbObjectType.table);
060        }
061    }
062
063    @Override
064    public void init(Object arg1) {
065        setObjectName((TObjectName) arg1);
066    }
067
068    @Override
069    public void accept(TParseTreeVisitor v) {
070        v.preVisit(this);
071        v.postVisit(this);
072    }
073
074    @Override
075    public void acceptChildren(TParseTreeVisitor v) {
076        v.preVisit(this);
077        if (objectName != null) {
078            objectName.acceptChildren(v);
079        }
080        if (renameTo != null) {
081            renameTo.acceptChildren(v);
082        }
083        v.postVisit(this);
084    }
085}