Пример #1
0
  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()];
  }