예제 #1
0
  private static List<SuggestedItem> find(Mode m, SearchIndex index, String tokenList) {
    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

    // 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(new SuggestedItem(si));
      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()];
  }