001package gudusoft.gsqlparser.catalog.input.model;
002
003import java.util.Objects;
004
005/**
006 * Synonym entry inside a {@link SchemaModel}.
007 *
008 * <p>Plan ยง6. {@code targetQualifiedName} is the dotted reference the synonym
009 * resolves to; the resolver normalizes/parses it through
010 * {@code CatalogIdentifierPolicy} when materializing the synonym.</p>
011 */
012public final class SynonymModel {
013
014    private final String name;
015    private final String targetQualifiedName;
016
017    private SynonymModel(Builder b) {
018        if (b.name == null || b.name.isEmpty()) {
019            throw new IllegalArgumentException("SynonymModel.name is required");
020        }
021        if (b.targetQualifiedName == null || b.targetQualifiedName.isEmpty()) {
022            throw new IllegalArgumentException(
023                "SynonymModel.targetQualifiedName is required (synonym '" + b.name + "')");
024        }
025        this.name = b.name;
026        this.targetQualifiedName = b.targetQualifiedName;
027    }
028
029    public static Builder builder() {
030        return new Builder();
031    }
032
033    public String name() {
034        return name;
035    }
036
037    public String targetQualifiedName() {
038        return targetQualifiedName;
039    }
040
041    @Override
042    public boolean equals(Object o) {
043        if (this == o) return true;
044        if (!(o instanceof SynonymModel)) return false;
045        SynonymModel that = (SynonymModel) o;
046        return name.equals(that.name) && targetQualifiedName.equals(that.targetQualifiedName);
047    }
048
049    @Override
050    public int hashCode() {
051        return Objects.hash(name, targetQualifiedName);
052    }
053
054    @Override
055    public String toString() {
056        return "SynonymModel{name=" + name + ", target=" + targetQualifiedName + '}';
057    }
058
059    public static final class Builder {
060
061        private String name;
062        private String targetQualifiedName;
063
064        private Builder() {
065        }
066
067        public Builder name(String v) {
068            this.name = v;
069            return this;
070        }
071
072        public Builder targetQualifiedName(String v) {
073            this.targetQualifiedName = v;
074            return this;
075        }
076
077        public SynonymModel build() {
078            return new SynonymModel(this);
079        }
080    }
081}