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}