001package gudusoft.gsqlparser.sqlenv.catalog;
002
003import gudusoft.gsqlparser.sqlenv.ESQLDataObjectType;
004import gudusoft.gsqlparser.sqlenv.TSQLCatalog;
005import gudusoft.gsqlparser.sqlenv.TSQLEnv;
006import gudusoft.gsqlparser.sqlenv.TSQLSchemaObject;
007
008import java.util.ArrayList;
009import java.util.List;
010
011/**
012 * Legacy Catalog Provider(兼容旧实现)
013 *
014 * <p>此实现包装 TSQLEnv 的旧 catalogList,提供 ICatalogProvider 接口。
015 *
016 * @since 3.2.0 (Phase 0)
017 */
018public class LegacyCatalogProvider implements ICatalogProvider {
019
020    private final TSQLEnv sqlEnv;
021    private final List<TSQLCatalog> catalogList;
022    private String defaultCatalogName;
023
024    public LegacyCatalogProvider(TSQLEnv sqlEnv, List<TSQLCatalog> catalogList) {
025        this.sqlEnv = sqlEnv;
026        this.catalogList = catalogList;
027    }
028
029    @Override
030    public TSQLCatalog getCatalog(String catalogName) {
031        // Delegate to TSQLEnv's searchCatalog
032        return sqlEnv.searchCatalog(catalogName);
033    }
034
035    @Override
036    public TSQLCatalog createCatalog(String catalogName) {
037        // Delegate to TSQLEnv's createSQLCatalog
038        return sqlEnv.createSQLCatalog(catalogName);
039    }
040
041    @Override
042    public List<TSQLCatalog> getAllCatalogs() {
043        return new ArrayList<>(catalogList);
044    }
045
046    @Override
047    public String getDefaultCatalogName() {
048        return defaultCatalogName != null ? defaultCatalogName : sqlEnv.getDefaultCatalogName();
049    }
050
051    @Override
052    public void setDefaultCatalogName(String name) {
053        this.defaultCatalogName = name;
054        sqlEnv.setDefaultCatalogName(name);
055    }
056
057    @Override
058    public TSQLSchemaObject findObject(String catalog, String schema,
059                                        String objectName, ESQLDataObjectType type) {
060        // Build qualified name catalog.schema.object
061        String qualifiedName;
062        if (catalog != null && !catalog.isEmpty() && schema != null && !schema.isEmpty()) {
063            qualifiedName = catalog + "." + schema + "." + objectName;
064        } else if (schema != null && !schema.isEmpty()) {
065            qualifiedName = "." + schema + "." + objectName;
066        } else if (catalog != null && !catalog.isEmpty()) {
067            qualifiedName = catalog + ".." + objectName;
068        } else {
069            qualifiedName = ".." + objectName;
070        }
071
072        // Delegate to TSQLEnv's searchSchemaObject
073        return sqlEnv.searchSchemaObject(qualifiedName, type);
074    }
075
076    @Override
077    public void addObject(TSQLSchemaObject object) {
078        // The object is already added through TSQLSchema.addSchemaObject()
079        // which calls TSQLEnv.putSchemaObject()
080        // So this method doesn't need to do anything for legacy implementation
081
082        // Note: TSQLSchemaObject constructor already adds itself to schema via schema.addSchemaObject(this)
083        // which eventually calls TSQLEnv.putSchemaObject()
084    }
085
086    @Override
087    public boolean removeObject(TSQLSchemaObject object) {
088        // Legacy implementation doesn't support removal
089        // Would need to traverse catalogList → schemaList → objectList
090        throw new UnsupportedOperationException("removeObject is not supported in legacy implementation");
091    }
092
093    @Override
094    public void clear() {
095        catalogList.clear();
096        // Note: This doesn't clear the schemaObjectList in TSQLEnv
097        // For a complete clear, would need to access TSQLEnv internals
098    }
099
100    @Override
101    public int size() {
102        // Count all objects across all catalogs and schemas
103        int count = 0;
104        for (TSQLCatalog catalog : catalogList) {
105            for (gudusoft.gsqlparser.sqlenv.TSQLSchema schema : catalog.getSchemaList()) {
106                count += schema.getSchemaObjectList().size();
107            }
108        }
109        return count;
110    }
111}