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}