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}