/**
   * Returns list of matched party ids based on first and last name
   *
   * @param firstName
   * @param lastName
   * @return
   */
  public Set<Match> search(String firstName, String lastName) {
    lastName = lastName.trim();
    firstName = firstName.trim();

    Set<String> candidateParties = new HashSet<String>();
    Set<Match> matchedParties = new HashSet<Match>();

    if (firstName.isEmpty()) {
      // search just against lastnames

      List<ParsedNamePart> parsedNameParts = nameParts.get(TYPE_LAST_NAME);
      if (parsedNameParts != null) {
        for (int i = 0; i < parsedNameParts.size(); i++) {
          ParsedNamePart namePart = parsedNameParts.get(i);
          if (namePart.getValue().trim().equalsIgnoreCase(lastName)) {
            matchedParties.add(new Match(namePart.getPartyId(), 100));
          }
        }
      }
    } else {
      // search against lastname ans firstname
      List<ParsedNamePart> parsedNameParts = nameParts.get(TYPE_LAST_NAME);
      if (parsedNameParts != null) {
        for (int i = 0; i < parsedNameParts.size(); i++) {
          ParsedNamePart namePart = parsedNameParts.get(i);
          if (namePart.getValue().trim().equalsIgnoreCase(lastName)) {
            candidateParties.add(namePart.getPartyId());
          }
        }
      }

      parsedNameParts = nameParts.get(TYPE_FIRST_NAME);
      if (parsedNameParts != null) {
        for (int i = 0; i < parsedNameParts.size(); i++) {
          ParsedNamePart namePart = parsedNameParts.get(i);
          if (candidateParties.contains(namePart.getPartyId())) {
            if (namePart.getValue().trim().equalsIgnoreCase(firstName)) {
              // ok seems like we have a winner
              matchedParties.add(new Match(namePart.getPartyId(), 100));
            }
          }
        }
      }

      if (matchedParties.size() == 0) {
        // both first name and last name didn't match
        // so lets report at least lastname matches with 50% score/confidence
        for (String candidateParty : candidateParties) {
          matchedParties.add(new Match(candidateParty, 50));
        }
      }
    }
    return matchedParties;
  }