001package gudusoft.gsqlparser.resolver2.result; 002 003import gudusoft.gsqlparser.TCustomSqlStatement; 004import gudusoft.gsqlparser.nodes.TTable; 005import gudusoft.gsqlparser.nodes.TObjectName; 006import gudusoft.gsqlparser.nodes.TCTE; 007import gudusoft.gsqlparser.resolver2.scope.IScope; 008 009import gudusoft.gsqlparser.resolver2.model.ResolutionStatistics; 010 011import java.util.List; 012import java.util.Set; 013 014/** 015 * TSQLResolver2 解析结果的访问接口 016 * 017 * <p>设计原则:</p> 018 * <ul> 019 * <li>语句为中心 - 按语句查询表和列</li> 020 * <li>复用现有类型 - 直接返回 TTable、TObjectName、TCTE</li> 021 * <li>按需查询 - 不预构建所有数据</li> 022 * </ul> 023 * 024 * <p>使用示例:</p> 025 * <pre> 026 * TSQLResolver2 resolver = new TSQLResolver2(context, statements); 027 * resolver.resolve(); 028 * 029 * IResolutionResult result = resolver.getResult(); 030 * 031 * // 按语句遍历 032 * for (TCustomSqlStatement stmt : resolver.getStatements()) { 033 * // 获取语句中的表 034 * for (TTable table : result.getTables(stmt)) { 035 * System.out.println("Table: " + table.getFullName()); 036 * 037 * // 获取关联到此表的列 038 * for (TObjectName col : result.getColumnsForTable(stmt, table)) { 039 * System.out.println(" Column: " + col.getColumnNameOnly()); 040 * System.out.println(" Resolved: " + (col.getSourceTable() != null)); 041 * } 042 * } 043 * 044 * // 获取孤儿列(未解析的列) 045 * for (TObjectName orphan : result.getOrphanColumns(stmt)) { 046 * System.out.println(" Orphan: " + orphan.getColumnNameOnly()); 047 * } 048 * 049 * // 递归处理子语句 050 * for (TCustomSqlStatement subStmt : stmt.getStatements()) { 051 * // 使用相同的 result 对象处理子语句 052 * } 053 * } 054 * 055 * // 全局访问(批量处理时有用) 056 * Set<String> allTables = result.getAllTableNames(); 057 * Set<String> allFields = result.getAllFieldNames(); 058 * </pre> 059 */ 060public interface IResolutionResult { 061 062 // ==================== 语句级查询方法 ==================== 063 064 /** 065 * 获取指定语句的 Scope 066 * 仅供高级用户使用,一般不需要直接访问 Scope 067 * 068 * @param stmt SQL语句 069 * @return 该语句对应的 Scope,如果不存在返回 null 070 */ 071 IScope getScope(TCustomSqlStatement stmt); 072 073 /** 074 * 获取指定语句中涉及的所有表 075 * 默认过滤:排除 JOIN 容器,包含物理表 076 * 077 * @param stmt SQL语句 078 * @return 表列表 079 */ 080 List<TTable> getTables(TCustomSqlStatement stmt); 081 082 /** 083 * 获取指定语句中涉及的所有表(带过滤选项) 084 * 085 * @param stmt SQL语句 086 * @param options 过滤选项 087 * @return 表列表 088 */ 089 List<TTable> getTables(TCustomSqlStatement stmt, TableFilterOptions options); 090 091 /** 092 * 获取指定语句中涉及的所有列引用 093 * 094 * @param stmt SQL语句 095 * @return 列列表 096 */ 097 List<TObjectName> getColumns(TCustomSqlStatement stmt); 098 099 /** 100 * 获取关联到指定表的列 101 * 102 * @param stmt SQL语句 103 * @param table 目标表 104 * @return 关联到此表的列列表 105 */ 106 List<TObjectName> getColumnsForTable(TCustomSqlStatement stmt, TTable table); 107 108 /** 109 * 获取指定语句中未解析的列(孤儿列) 110 * 即 sourceTable 为 null 的列 111 * 112 * @param stmt SQL语句 113 * @return 孤儿列列表 114 */ 115 List<TObjectName> getOrphanColumns(TCustomSqlStatement stmt); 116 117 /** 118 * 获取指定语句中的 CTE 定义 119 * 120 * @param stmt SQL语句(通常是包含 WITH 子句的 SELECT) 121 * @return CTE 列表 122 */ 123 List<TCTE> getCTEs(TCustomSqlStatement stmt); 124 125 // ==================== 全局访问方法 ==================== 126 127 /** 128 * 获取所有表名(全局去重) 129 * 适用于批量处理场景 130 * 131 * @return 所有表名集合 132 */ 133 Set<String> getAllTableNames(); 134 135 /** 136 * 获取所有字段名(table.column 格式,全局去重) 137 * 138 * @return 所有字段名集合 139 */ 140 Set<String> getAllFieldNames(); 141 142 /** 143 * 获取所有 CTE 名称 144 * 145 * @return CTE 名称集合 146 */ 147 Set<String> getAllCTENames(); 148 149 /** 150 * 获取所有已解析的列(sourceTable != null) 151 * 152 * @return 已解析列列表 153 */ 154 List<TObjectName> getAllResolvedColumns(); 155 156 /** 157 * 获取所有未解析的列(sourceTable == null) 158 * 159 * @return 未解析列列表 160 */ 161 List<TObjectName> getAllUnresolvedColumns(); 162 163 // ==================== 统计信息 ==================== 164 165 /** 166 * 获取解析统计信息 167 * 168 * @return 统计信息 (使用 gudusoft.gsqlparser.resolver2.model.ResolutionStatistics) 169 */ 170 ResolutionStatistics getStatistics(); 171}