private static List<SuggestedItem> find( Mode m, SearchIndex index, String tokenList, SearchableModelObject searchContext) { TokenList tokens = new TokenList(tokenList); if (tokens.length() == 0) return Collections.emptyList(); // no tokens given List<SuggestedItem>[] paths = new List[tokens.length() + 1]; // we won't use [0]. for (int i = 1; i <= tokens.length(); i++) paths[i] = new ArrayList<SuggestedItem>(); List<SearchItem> items = new ArrayList<SearchItem>(); // items found in 1 step LOGGER.log(Level.FINE, "tokens={0}", tokens); // first token int w = 1; // width of token for (String token : tokens.subSequence(0)) { items.clear(); m.find(index, token, items); for (SearchItem si : items) { paths[w].add(SuggestedItem.build(searchContext, si)); LOGGER.log(Level.FINE, "found search item: {0}", si.getSearchName()); } w++; } // successive tokens for (int j = 1; j < tokens.length(); j++) { // for each length w = 1; for (String token : tokens.subSequence(j)) { // for each candidate for (SuggestedItem r : paths[j]) { items.clear(); m.find(r.item.getSearchIndex(), token, items); for (SearchItem i : items) paths[j + w].add(new SuggestedItem(r, i)); } w++; } } return paths[tokens.length()]; }