001 002package gudusoft.gsqlparser.util; 003 004import gudusoft.gsqlparser.EDbVendor; 005 006import java.util.*; 007 008public class keywordChecker { 009 010 private static final String COMMA = ","; 011 private static final String MINUS = "-"; 012 013 public static enum keywordType { 014 reserved_keyword, non_reserved_keyword, not_a_keyword; 015 } 016 017 private keywordChecker() { 018 } 019 020 public static LinkedHashMap<String, keywordType> checkKeywordType(String inputString, EDbVendor dbvendor) { 021 LinkedHashMap<String, keywordType> keywordTypes = new LinkedHashMap<>(); 022 if (inputString == null || inputString.trim().equals("")) 023 return keywordTypes; 024 String latestVersion = getDbLatestVersion(dbvendor); 025 if (SQLUtil.isEmpty(latestVersion)) { 026 return keywordTypes; 027 } 028 029 keywordList keywordList = keywordListFactory.getInstance() 030 .getDbKeywordList(dbvendor, latestVersion); 031 if (keywordList == null) { 032 return keywordTypes; 033 } 034 035 for (String word : inputString.split("\\s*,\\s*")) { 036 word = word.toUpperCase().trim(); 037 if (keywordList.getReservedList().contains(word)) { 038 keywordTypes.put(word, keywordType.reserved_keyword); 039 } else if (keywordList.getKeywordList().contains(word)) { 040 keywordTypes.put(word, keywordType.non_reserved_keyword); 041 } else { 042 keywordTypes.put(word, keywordType.not_a_keyword); 043 } 044 } 045 return keywordTypes; 046 } 047 048 /** 049 * @param dbVersion, available database version can be check via {@link #getAvailableDbVersions(gudusoft.gsqlparser.EDbVendor)} 050 */ 051 public static boolean isKeyword(String inputString, EDbVendor dbvendor, 052 String dbVersion, boolean reservedOnly) { 053 if (inputString == null || inputString.trim().equals("")) 054 return false; 055 056 String keyword = inputString.toUpperCase(); 057 058 keywordList keywordList = keywordListFactory.getInstance() 059 .getDbKeywordList(dbvendor, dbVersion); 060 if (keywordList == null) { 061 throw new IllegalArgumentException("Can't get available keyword list"); 062 } 063 064 if (reservedOnly) 065 return keywordList.getReservedList().contains(keyword); 066 else 067 return keywordList.getKeywordList().contains(keyword); 068 } 069 070 public static String getKeywordList(EDbVendor dbvendor, String dbVersion, 071 boolean reservedOnly) { 072 keywordList keywordList = keywordListFactory.getInstance() 073 .getDbKeywordList(dbvendor, dbVersion); 074 if (keywordList == null) { 075 throw new IllegalArgumentException("Can't get available keyword list"); 076 } 077 078 List<String> keywords = null; 079 if (reservedOnly) 080 keywords = keywordList.getReservedList(); 081 else 082 keywords = keywordList.getKeywordList(); 083 084 if (keywords != null) { 085 StringBuffer buffer = new StringBuffer(); 086 for (int i = 0; i < keywords.size(); i++) { 087 if (i < keywords.size() - 1) 088 buffer.append(keywords.get(i)).append(COMMA); 089 else 090 buffer.append(keywords.get(i)); 091 } 092 return buffer.toString(); 093 } 094 return null; 095 } 096 097 public static String compareKeywordList(EDbVendor dbvendor1, 098 String dbVersion1, EDbVendor dbvendor2, String dbVersion2, 099 boolean reservedOnly) { 100 keywordList keywordList1 = keywordListFactory.getInstance() 101 .getDbKeywordList(dbvendor1, dbVersion1); 102 keywordList keywordList2 = keywordListFactory.getInstance() 103 .getDbKeywordList(dbvendor2, dbVersion2); 104 105 if (keywordList1 == null || keywordList2 == null) { 106 throw new IllegalArgumentException("Can't get available keyword list"); 107 } 108 109 List<String> list1 = new ArrayList<String>(); 110 List<String> list2 = new ArrayList<String>(); 111 List<String> retainList = new ArrayList<String>(); 112 113 if (reservedOnly) { 114 retainList.addAll(keywordList1.getReservedList()); 115 retainList.retainAll(keywordList2.getReservedList()); 116 list1.addAll(keywordList1.getReservedList()); 117 list2.addAll(keywordList2.getReservedList()); 118 } else { 119 retainList.addAll(keywordList1.getKeywordList()); 120 retainList.retainAll(keywordList2.getKeywordList()); 121 list1.addAll(keywordList1.getKeywordList()); 122 list2.addAll(keywordList2.getKeywordList()); 123 } 124 125 list1.removeAll(retainList); 126 list2.removeAll(retainList); 127 128 for (int i = 0; i < list2.size(); i++) { 129 list1.add(MINUS + list2.get(i)); 130 } 131 132 Collections.sort(list1, new Comparator<String>() { 133 134 public int compare(String str1, String str2) { 135 if (!str1.startsWith(MINUS)) 136 str1 = MINUS + str1; 137 if (!str2.startsWith(MINUS)) 138 str2 = MINUS + str2; 139 return str1.compareToIgnoreCase(str2); 140 } 141 142 }); 143 144 StringBuffer buffer = new StringBuffer(); 145 for (int i = 0; i < list1.size(); i++) { 146 buffer.append(list1.get(i)); 147 if (i < list1.size() - 1) 148 buffer.append(COMMA); 149 } 150 return buffer.toString(); 151 } 152 153 /** 154 * <table summary=""> 155 * <tr> 156 * <th>Database</th> 157 * <th>Supported Versions</th> 158 * </tr> 159 * <tr> 160 * <td>MySQL</td> 161 * <td>5.4, 5.7, 5.0, 4.1, 5.5, 5.3, 3.23, 5.1, 5.6, 6.0, 5.2, 4.0</td> 162 * </tr> 163 * <tr> 164 * <td>MSSQL</td> 165 * <td>10.5, 10.0, 8.0, 9.0, 12.0</td> 166 * </tr> 167 * <tr> 168 * <td>Netezza</td> 169 * <td>5.0, 6.0, 4.6.5</td> 170 * </tr> 171 * <tr> 172 * <td>Oracle</td> 173 * <td>10, 11.1, 9, 11.2, 8</td> 174 * </tr> 175 * <tr> 176 * <td>ODBC</td> 177 * <td>ODBC</td> 178 * </tr> 179 * <tr> 180 * <td>PostgreSQL</td> 181 * <td>8.2, 9.3, 7.4, 9.0, 7.1, 8.3, 9.1, 8.4, 7.2, 8.0, 7.3, 9.2, 8.1</td> 182 * </tr> 183 * <tr> 184 * <td>Sybase</td> 185 * <td>12.5, 15.5, 15.0, 15.7</td> 186 * </tr> 187 * <tr> 188 * <td>Teradata</td> 189 * <td>V2R3, 14.0, V2R6, V2R4, 12.0, 13.0, 13.1, V2R5.1, V2R5</td> 190 * </tr> 191 * </table> 192 */ 193 public static List<String> getAvailableDbVersions(EDbVendor dbvendor) { 194 return keywordListFactory.getInstance() 195 .getAvailableDbVersions(dbvendor); 196 } 197 198 public static String getDbLatestVersion(EDbVendor dbvendor) { 199 return keywordListFactory.getInstance() 200 .getDbLatestVersion(dbvendor); 201 } 202 203 public static boolean containsDbVersion(EDbVendor dbvendor, 204 String dbVersion) { 205 return keywordListFactory.getInstance().containsDbVersion(dbvendor, 206 dbVersion); 207 } 208 209 public static void main(String[] args) { 210 keywordChecker.getAvailableDbVersions(EDbVendor.dbvsybase) 211 .size(); 212 keywordChecker.getKeywordList(EDbVendor.dbvsybase, "15.7", false); 213 keywordChecker.getKeywordList(EDbVendor.dbvsybase, "12.5", false); 214 215 long time = System.currentTimeMillis(); 216 String keywordStr = keywordChecker.getKeywordList(EDbVendor.dbvsybase, 217 "15.7", 218 false); 219 String[] keywords = keywordStr.split(","); 220 for (int i = 0; i < keywords.length; i++) { 221 boolean flag = keywordChecker.isKeyword(keywords[i].trim(), 222 EDbVendor.dbvsybase, 223 "15.7", 224 false); 225 if (!flag) { 226 System.out.println(keywords[i] + "'s status is error"); 227 } 228 } 229 keywordChecker.compareKeywordList(EDbVendor.dbvsybase, 230 "15.7", 231 EDbVendor.dbvsybase, 232 "12.5", 233 false); 234 System.out.println("Time=" 235 + (System.currentTimeMillis() - time) 236 + "ms"); 237 } 238}