001package gudusoft.gsqlparser.ir.bound;
002
003import gudusoft.gsqlparser.ir.common.Evidence;
004import gudusoft.gsqlparser.ir.common.IRNode;
005import gudusoft.gsqlparser.ir.common.IRNodeKind;
006import gudusoft.gsqlparser.ir.common.IRVisitor;
007
008import java.util.Collections;
009import java.util.List;
010
011/**
012 * Bound reference to a table, view, CTE, or derived table.
013 * <p>
014 * Resolves a text identifier to a specific semantic object (table/view/CTE/etc).
015 */
016public class BoundObjectRef extends IRNode {
017
018    /** Original text (e.g., "schema.table"). */
019    private final String originalText;
020
021    /** Name parts (e.g., [schema, table] or [table]). */
022    private final List<String> nameParts;
023
024    /** Binding status. */
025    private final EBindingStatus bindingStatus;
026
027    /** Resolved object symbol (non-null when EXACT). */
028    private final BoundSymbol resolvedSymbol;
029
030    /** Candidate symbols (non-empty when AMBIGUOUS). */
031    private final List<BoundSymbol> candidates;
032
033    /** Object type. */
034    private final EObjectRefKind refKind;
035
036    /** Evidence for binding decision. */
037    private final Evidence evidence;
038
039    public BoundObjectRef(String originalText, List<String> nameParts,
040                          EBindingStatus bindingStatus, BoundSymbol resolvedSymbol,
041                          List<BoundSymbol> candidates, EObjectRefKind refKind,
042                          Evidence evidence) {
043        this.originalText = originalText;
044        this.nameParts = nameParts != null
045                ? Collections.unmodifiableList(nameParts)
046                : Collections.<String>emptyList();
047        this.bindingStatus = bindingStatus;
048        this.resolvedSymbol = resolvedSymbol;
049        this.candidates = candidates != null
050                ? Collections.unmodifiableList(candidates)
051                : Collections.<BoundSymbol>emptyList();
052        this.refKind = refKind;
053        this.evidence = evidence;
054    }
055
056    public String getOriginalText() { return originalText; }
057    public List<String> getNameParts() { return nameParts; }
058    public EBindingStatus getBindingStatus() { return bindingStatus; }
059    public BoundSymbol getResolvedSymbol() { return resolvedSymbol; }
060    public List<BoundSymbol> getCandidates() { return candidates; }
061    public EObjectRefKind getRefKind() { return refKind; }
062    public Evidence getEvidence() { return evidence; }
063
064    @Override
065    public IRNodeKind getKind() {
066        return IRNodeKind.BOUND_OBJECT_REF;
067    }
068
069    @Override
070    public <R, C> R accept(IRVisitor<R, C> visitor, C context) {
071        return visitor.visitBoundObjectRef(this, context);
072    }
073
074    @Override
075    public String toString() {
076        return "BoundObjectRef{" + originalText + ", " + bindingStatus + ", " + refKind + "}";
077    }
078}