001package gudusoft.gsqlparser.ir.semantic.binding; 002 003import gudusoft.gsqlparser.resolver2.ResolutionStatus; 004 005/** 006 * Binding of a column reference to its resolved source. Carries the 007 * {@link ResolutionStatus} so callers can distinguish exact, ambiguous, and 008 * unresolved bindings. Slice 1 only allows {@link ResolutionStatus#EXACT_MATCH} 009 * through to the IR layer, but the binding type stays general so future 010 * slices can surface diagnostics without an API change. 011 */ 012public final class ColumnBinding { 013 014 private final String relationAlias; 015 private final String columnName; 016 private final String finalTableQualifiedName; 017 private final ResolutionStatus status; 018 019 public ColumnBinding(String relationAlias, 020 String columnName, 021 String finalTableQualifiedName, 022 ResolutionStatus status) { 023 if (relationAlias == null || relationAlias.isEmpty()) { 024 throw new IllegalArgumentException("relationAlias must be non-empty"); 025 } 026 if (columnName == null || columnName.isEmpty()) { 027 throw new IllegalArgumentException("columnName must be non-empty"); 028 } 029 if (status == null) { 030 throw new IllegalArgumentException("status must not be null"); 031 } 032 this.relationAlias = relationAlias; 033 this.columnName = columnName; 034 this.finalTableQualifiedName = finalTableQualifiedName; 035 this.status = status; 036 } 037 038 public String getRelationAlias() { 039 return relationAlias; 040 } 041 042 public String getColumnName() { 043 return columnName; 044 } 045 046 /** 047 * Final physical table as reported by 048 * {@code ColumnSource.getFinalTable()}. May be {@code null} if Resolver2 049 * did not produce a final table (e.g. literal, function, ambiguous). 050 */ 051 public String getFinalTableQualifiedName() { 052 return finalTableQualifiedName; 053 } 054 055 public ResolutionStatus getStatus() { 056 return status; 057 } 058}