001package gudusoft.gsqlparser.ir.builder.mssql; 002 003import gudusoft.gsqlparser.ir.bound.BoundTypeRef; 004import gudusoft.gsqlparser.ir.bound.ETypeCategory; 005import gudusoft.gsqlparser.nodes.TTypeName; 006 007/** 008 * Maps T-SQL type names to {@link BoundTypeRef} instances. 009 */ 010public final class MssqlTypeRefMapper { 011 012 private MssqlTypeRefMapper() {} 013 014 /** 015 * Creates a {@link BoundTypeRef} from a GSP {@link TTypeName}. 016 * 017 * @param typeName AST type name node 018 * @return bound type reference, or null if typeName is null 019 */ 020 public static BoundTypeRef map(TTypeName typeName) { 021 if (typeName == null) { 022 return null; 023 } 024 String typeText = typeName.toString().trim(); 025 ETypeCategory category = inferCategory(typeText); 026 return new BoundTypeRef(typeText, category); 027 } 028 029 /** 030 * Creates a {@link BoundTypeRef} from a raw type string. 031 */ 032 public static BoundTypeRef fromString(String typeText) { 033 if (typeText == null || typeText.trim().isEmpty()) { 034 return null; 035 } 036 return new BoundTypeRef(typeText.trim(), inferCategory(typeText.trim())); 037 } 038 039 private static ETypeCategory inferCategory(String typeText) { 040 String upper = typeText.toUpperCase(); 041 if (upper.startsWith("TABLE")) { 042 return ETypeCategory.TABLE_OF; 043 } 044 if (upper.contains("CURSOR")) { 045 return ETypeCategory.REF_CURSOR; 046 } 047 return ETypeCategory.SCALAR; 048 } 049}