001package gudusoft.gsqlparser.resolver2.enhancement; 002 003import gudusoft.gsqlparser.resolver2.namespace.INamespace; 004 005import java.util.*; 006 007/** 008 * Result of a namespace enhancement pass. 009 * Tracks which columns were added to which namespaces. 010 */ 011public class EnhancementResult { 012 013 /** The pass number this enhancement was performed for */ 014 private final int passNumber; 015 016 /** Columns that were successfully added, grouped by namespace */ 017 private final Map<INamespace, Set<String>> addedColumns; 018 019 /** Columns that were skipped (already existed), grouped by namespace */ 020 private final Map<INamespace, Set<String>> skippedColumns; 021 022 /** All collected references that were processed */ 023 private final List<CollectedColumnRef> processedRefs; 024 025 /** Total columns added across all namespaces */ 026 private int totalAdded; 027 028 /** Total columns skipped (duplicates) */ 029 private int totalSkipped; 030 031 public EnhancementResult(int passNumber) { 032 this.passNumber = passNumber; 033 this.addedColumns = new LinkedHashMap<>(); 034 this.skippedColumns = new LinkedHashMap<>(); 035 this.processedRefs = new ArrayList<>(); 036 this.totalAdded = 0; 037 this.totalSkipped = 0; 038 } 039 040 /** 041 * Record a column that was successfully added 042 */ 043 public void recordAdded(INamespace namespace, String columnName, CollectedColumnRef ref) { 044 addedColumns.computeIfAbsent(namespace, k -> new LinkedHashSet<>()).add(columnName); 045 processedRefs.add(ref); 046 totalAdded++; 047 } 048 049 /** 050 * Record a column that was skipped (already exists) 051 */ 052 public void recordSkipped(INamespace namespace, String columnName, CollectedColumnRef ref) { 053 skippedColumns.computeIfAbsent(namespace, k -> new LinkedHashSet<>()).add(columnName); 054 processedRefs.add(ref); 055 totalSkipped++; 056 } 057 058 public int getPassNumber() { 059 return passNumber; 060 } 061 062 public Map<INamespace, Set<String>> getAddedColumns() { 063 return Collections.unmodifiableMap(addedColumns); 064 } 065 066 public Map<INamespace, Set<String>> getSkippedColumns() { 067 return Collections.unmodifiableMap(skippedColumns); 068 } 069 070 public List<CollectedColumnRef> getProcessedRefs() { 071 return Collections.unmodifiableList(processedRefs); 072 } 073 074 public int getTotalAdded() { 075 return totalAdded; 076 } 077 078 public int getTotalSkipped() { 079 return totalSkipped; 080 } 081 082 public int getNamespaceCount() { 083 return addedColumns.size(); 084 } 085 086 /** 087 * Check if any columns were added in this enhancement 088 */ 089 public boolean hasChanges() { 090 return totalAdded > 0; 091 } 092 093 /** 094 * Get columns added to a specific namespace 095 */ 096 public Set<String> getColumnsAddedTo(INamespace namespace) { 097 return addedColumns.getOrDefault(namespace, Collections.emptySet()); 098 } 099 100 @Override 101 public String toString() { 102 return String.format("EnhancementResult{pass=%d, added=%d, skipped=%d, namespaces=%d}", 103 passNumber, totalAdded, totalSkipped, addedColumns.size()); 104 } 105 106 /** 107 * Generate a detailed report of this enhancement 108 */ 109 public String toDetailedReport() { 110 StringBuilder sb = new StringBuilder(); 111 sb.append("=== Namespace Enhancement Report (Pass ").append(passNumber).append(") ===\n"); 112 sb.append(String.format("Total: %d added, %d skipped, %d namespaces affected\n\n", 113 totalAdded, totalSkipped, addedColumns.size())); 114 115 for (Map.Entry<INamespace, Set<String>> entry : addedColumns.entrySet()) { 116 INamespace ns = entry.getKey(); 117 Set<String> cols = entry.getValue(); 118 sb.append("Namespace: ").append(ns.getDisplayName()).append("\n"); 119 sb.append(" Added columns: ").append(cols).append("\n"); 120 121 Set<String> skipped = skippedColumns.get(ns); 122 if (skipped != null && !skipped.isEmpty()) { 123 sb.append(" Skipped (existing): ").append(skipped).append("\n"); 124 } 125 sb.append("\n"); 126 } 127 128 return sb.toString(); 129 } 130}