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}