001package gudusoft.gsqlparser.sqlenv;
002
003import gudusoft.gsqlparser.EDbVendor;
004
005import java.util.Objects;
006
007/**
008 * Value object representing a multi-part qualified name and its canonical form.
009 */
010public final class QualifiedName {
011
012    public final String server;
013    public final String catalog;
014    public final String schema;
015    public final String object;
016    public final String column; // optional
017    public final ESQLDataObjectType objectType;
018
019    public final String cServer;
020    public final String cCatalog;
021    public final String cSchema;
022    public final String cObject;
023    public final String cColumn;
024
025    public QualifiedName(EDbVendor vendor,
026                         String server,
027                         String catalog,
028                         String schema,
029                         String object,
030                         String column,
031                         ESQLDataObjectType objectType) {
032        this.server = server == null ? TSQLEnv.DEFAULT_SERVER_NAME : server;
033        this.catalog = catalog;
034        this.schema = schema;
035        this.object = Objects.requireNonNull(object, "object");
036        this.column = column;
037        this.objectType = Objects.requireNonNull(objectType, "objectType");
038
039        this.cServer = this.server; // server normalization currently identity
040        this.cCatalog = NameNormalizer.canonicalize(vendor, ESQLDataObjectType.dotCatalog, defaultIfNull(catalog, TSQLEnv.DEFAULT_DB_NAME));
041        this.cSchema = NameNormalizer.canonicalize(vendor, ESQLDataObjectType.dotSchema, defaultIfNull(schema, TSQLEnv.DEFAULT_SCHEMA_NAME));
042        this.cObject = NameNormalizer.canonicalize(vendor, this.objectType == ESQLDataObjectType.dotColumn ? ESQLDataObjectType.dotTable : this.objectType, this.object);
043        this.cColumn = column == null ? null : NameNormalizer.canonicalize(vendor, ESQLDataObjectType.dotColumn, column);
044    }
045
046    private static String defaultIfNull(String v, String def) {
047        return v == null ? def : v;
048    }
049
050    public NameKey toObjectKey() {
051        return new NameKey(objectType == ESQLDataObjectType.dotColumn ? ESQLDataObjectType.dotTable : objectType,
052                cServer, cCatalog, cSchema, cObject);
053    }
054
055    public NameKey toColumnTableKey() {
056        return new NameKey(ESQLDataObjectType.dotTable, cServer, cCatalog, cSchema, cObject);
057    }
058}
059
060