private CompletionCandidate[] getFilteredWords(int wordStart, String word) { List<CompletionCandidate> candidateList = new ArrayList<CompletionCandidate>(); // Here can add more candidates depending on magic word start. if (candidateList.isEmpty()) { QueryExecutor queryExecutor = queryExecutorCreator.createQueryExecutor(executionContextName); for (String s : queryExecutor.getTableNames()) { candidateList.add(new CompletionCandidate(KeyWordType.TABLE, s)); } for (String s : queryExecutor.getTableColumnNames()) { candidateList.add(new CompletionCandidate(KeyWordType.TABLE_COlUMN, s)); } queryExecutor.stopExecution(); for (String s : new String[] { "ALTER", "ASC", "BY", "DESC", "DROP", "FROM", "IN", "INNER", "INSERT", "INTO", "JOIN", "LEFT", "NOT", "ORDER", "SELECT", "UPDATE", "WHERE", "AND", "OR", "EXISTS", "HAVING", "TOP", "GROUP", "SET", }) { candidateList.add(new CompletionCandidate(KeyWordType.KEYWORD, s)); } } word = word.toUpperCase(Locale.ENGLISH); List<CompletionCandidate> filteredCompletionCandidateList = new ArrayList<CompletionCandidate>(); for (CompletionCandidate completionCandidate : candidateList) { if (completionCandidate .toString() .toLowerCase(Locale.ENGLISH) .startsWith(word.toLowerCase(Locale.ENGLISH))) { filteredCompletionCandidateList.add(completionCandidate); } } Collections.sort( filteredCompletionCandidateList, new Comparator<CompletionCandidate>() { @Override public int compare(CompletionCandidate o1, CompletionCandidate o2) { return String.CASE_INSENSITIVE_ORDER.compare(o1.toString(), o2.toString()); } }); return filteredCompletionCandidateList.toArray(new CompletionCandidate[0]); }