001package gudusoft.gsqlparser.resolver2.model;
002
003import gudusoft.gsqlparser.resolver2.namespace.INamespace;
004
005/**
006 * Represents a child namespace within a scope.
007 * Used in FROM clauses to track tables, subqueries, and their aliases.
008 *
009 * Example:
010 * FROM users u JOIN (SELECT * FROM orders) o
011 *      ^^^^^                               ^
012 *      child1 (users with alias 'u')       child2 (subquery with alias 'o')
013 */
014public class ScopeChild {
015    /** Ordinal position in the children list */
016    private final int ordinal;
017
018    /** Alias for this namespace (table alias) */
019    private final String alias;
020
021    /** The namespace itself */
022    private final INamespace namespace;
023
024    /**
025     * Whether this namespace is nullable.
026     * True for right side of LEFT JOIN, left side of RIGHT JOIN, etc.
027     */
028    private final boolean nullable;
029
030    public ScopeChild(int ordinal, String alias, INamespace namespace, boolean nullable) {
031        this.ordinal = ordinal;
032        this.alias = alias;
033        this.namespace = namespace;
034        this.nullable = nullable;
035    }
036
037    public int getOrdinal() {
038        return ordinal;
039    }
040
041    public String getAlias() {
042        return alias;
043    }
044
045    public INamespace getNamespace() {
046        return namespace;
047    }
048
049    public boolean isNullable() {
050        return nullable;
051    }
052
053    @Override
054    public String toString() {
055        StringBuilder sb = new StringBuilder();
056        if (alias != null) {
057            sb.append(alias).append(" -> ");
058        }
059        sb.append(namespace.getDisplayName());
060        if (nullable) {
061            sb.append(" (nullable)");
062        }
063        return sb.toString();
064    }
065}