001package gudusoft.gsqlparser.resolver2.matcher;
002
003/**
004 * Default implementation of INameMatcher.
005 * Uses case-insensitive matching (common default for most databases).
006 */
007public class DefaultNameMatcher implements INameMatcher {
008
009    private final boolean caseSensitive;
010
011    public DefaultNameMatcher() {
012        this(false); // Default: case-insensitive
013    }
014
015    public DefaultNameMatcher(boolean caseSensitive) {
016        this.caseSensitive = caseSensitive;
017    }
018
019    @Override
020    public boolean matches(String name1, String name2) {
021        if (name1 == null || name2 == null) {
022            return name1 == name2;
023        }
024
025        // Strip SQL delimiters (brackets, quotes) for comparison
026        String n1 = stripDelimiters(name1);
027        String n2 = stripDelimiters(name2);
028
029        if (caseSensitive) {
030            return n1.equals(n2);
031        } else {
032            return n1.equalsIgnoreCase(n2);
033        }
034    }
035
036    /**
037     * Strip SQL delimiters from a name.
038     * Handles: [name], "name", `name`
039     */
040    private String stripDelimiters(String name) {
041        if (name == null || name.length() < 2) {
042            return name;
043        }
044        // SQL Server brackets
045        if (name.startsWith("[") && name.endsWith("]")) {
046            return name.substring(1, name.length() - 1);
047        }
048        // Double quotes (ANSI SQL, Oracle, PostgreSQL)
049        if (name.startsWith("\"") && name.endsWith("\"")) {
050            return name.substring(1, name.length() - 1);
051        }
052        // Backticks (MySQL, BigQuery)
053        if (name.startsWith("`") && name.endsWith("`")) {
054            return name.substring(1, name.length() - 1);
055        }
056        return name;
057    }
058
059    @Override
060    public boolean matchesPattern(String name, String pattern) {
061        if (name == null || pattern == null) {
062            return false;
063        }
064
065        // Simple prefix matching for now
066        if (caseSensitive) {
067            return name.startsWith(pattern);
068        } else {
069            return name.toLowerCase().startsWith(pattern.toLowerCase());
070        }
071    }
072
073    @Override
074    public String normalize(String name) {
075        if (name == null) {
076            return null;
077        }
078
079        // Strip delimiters but preserve case
080        // Case handling is done during comparison, not normalization
081        return stripDelimiters(name);
082    }
083
084    @Override
085    public boolean isCaseSensitive() {
086        return caseSensitive;
087    }
088
089    @Override
090    public String toString() {
091        return "DefaultNameMatcher(caseSensitive=" + caseSensitive + ")";
092    }
093}