/**
   * Returns a map where the key is a user and the value is a naturally-sorted list of results they
   * should receive.
   *
   * @param results all the validation run results, in a sorted set
   * @return map of users to results
   */
  private Map<User, SortedSet<ValidationResult>> getUserResults(
      SortedSet<ValidationResult> results) {
    Map<User, SortedSet<ValidationResult>> userResults = new HashMap<>();

    for (ValidationResult result : results) {
      for (ValidationRuleGroup ruleGroup : result.getValidationRule().getGroups()) {
        if (ruleGroup.hasUserGroupsToAlert()) {
          for (UserGroup userGroup : ruleGroup.getUserGroupsToAlert()) {
            for (User user : userGroup.getMembers()) {
              if (!ruleGroup.isAlertByOrgUnits()
                  || canUserAccessSource(user, result.getOrgUnit())) {
                SortedSet<ValidationResult> resultSet = userResults.get(user);

                if (resultSet == null) {
                  resultSet = new TreeSet<>();

                  userResults.put(user, resultSet);
                }

                resultSet.add(result);
              }
            }
          }
        }
      }
    }
    return userResults;
  }