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}