001package gudusoft.gsqlparser.nodes.oceanbase;
002
003import gudusoft.gsqlparser.EDbObjectType;
004import gudusoft.gsqlparser.TSourceToken;
005import gudusoft.gsqlparser.nodes.TObjectName;
006import gudusoft.gsqlparser.nodes.TParseTreeNode;
007import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
008
009/**
010 * AST node for OceanBase {@code CREATE OUTLINE} (Phase 4 Batch 8).
011 *
012 * <p>OceanBase outlines bind a stored execution plan to a SQL pattern.
013 * Two documented forms:
014 * <ul>
015 *   <li><b>Bound to a parsed statement</b>: {@code CREATE OUTLINE name
016 *       ON SELECT ... [USING HINT /*+ ... *&#47;]}. The bound SQL is
017 *       parsed as a child via the top-level statement rule and exposed
018 *       through {@link #getBoundStatement()}. The optional USING HINT
019 *       clause carries a raw comment token.</li>
020 *   <li><b>Bound to a SQL ID</b>: {@code CREATE OUTLINE name ON
021 *       'SQL_ID_HEX_STRING'}. The SQL ID is stored as
022 *       {@link #getSqlId()}; {@link #getBoundStatement()} is null.</li>
023 * </ul>
024 *
025 * @since 4.0.1.4
026 */
027public class TOceanbaseCreateOutlineSqlNode extends TParseTreeNode {
028
029    private TObjectName outlineName;
030    private TParseTreeNode boundStatement;
031    private TObjectName sqlId;
032    private TSourceToken usingHintToken;
033    private boolean orReplace;
034
035    public TObjectName getOutlineName() {
036        return outlineName;
037    }
038
039    public void setOutlineName(TObjectName outlineName) {
040        this.outlineName = outlineName;
041        if (outlineName != null) {
042            outlineName.setDbObjectType(EDbObjectType.database);
043        }
044    }
045
046    public TParseTreeNode getBoundStatement() {
047        return boundStatement;
048    }
049
050    public void setBoundStatement(TParseTreeNode boundStatement) {
051        this.boundStatement = boundStatement;
052    }
053
054    public TObjectName getSqlId() {
055        return sqlId;
056    }
057
058    public void setSqlId(TObjectName sqlId) {
059        this.sqlId = sqlId;
060    }
061
062    public TSourceToken getUsingHintToken() {
063        return usingHintToken;
064    }
065
066    public void setUsingHintToken(TSourceToken usingHintToken) {
067        this.usingHintToken = usingHintToken;
068    }
069
070    public boolean isOrReplace() {
071        return orReplace;
072    }
073
074    public void setOrReplace(boolean orReplace) {
075        this.orReplace = orReplace;
076    }
077
078    @Override
079    public void init(Object arg1) {
080        setOutlineName((TObjectName) arg1);
081    }
082
083    @Override
084    public void accept(TParseTreeVisitor v) {
085        v.preVisit(this);
086        v.postVisit(this);
087    }
088
089    @Override
090    public void acceptChildren(TParseTreeVisitor v) {
091        v.preVisit(this);
092        if (outlineName != null) outlineName.acceptChildren(v);
093        if (boundStatement != null) boundStatement.acceptChildren(v);
094        if (sqlId != null) sqlId.acceptChildren(v);
095        v.postVisit(this);
096    }
097}