private Collection<SampleIdentity> filterOnlyExactExternalNameMatches(Collection<SampleIdentity> candidates, String externalNamesOrAlias) { return candidates.stream().filter(sam -> { Set<String> targets = SampleIdentityImpl.getSetFromString(externalNamesOrAlias).stream().map(String::toLowerCase) .collect(Collectors.toSet()); Set<String> externalNamesOfCandidate = SampleIdentityImpl.getSetFromString(sam.getExternalName()).stream() .map(String::toLowerCase).collect(Collectors.toSet()); targets.retainAll(externalNamesOfCandidate); return !targets.isEmpty() || externalNamesOrAlias.equals(sam.getAlias()); }).collect(Collectors.toSet()); }
@Override public Collection<SampleIdentity> getIdentitiesByExternalNameOrAliasAndProject(String query, Long projectId, boolean exactMatch) throws IOException { if (isStringEmptyOrNull(query)) return Collections.emptySet(); @SuppressWarnings("unchecked") Set<SampleIdentity> records = (Set<SampleIdentity>) SampleIdentityImpl.getSetFromString(query) .stream().map(extNameOrAlias -> { String str = DbUtils.convertStringToSearchQuery(extNameOrAlias, false); Criteria criteria = currentSession().createCriteria(SampleIdentityImpl.class); if (projectId != null) { criteria.add(Restrictions.eq("project.id", projectId)); } criteria.add(Restrictions.or(Restrictions.ilike("externalName", str), Restrictions.ilike("alias", str))); return criteria.list(); }).flatMap(list -> list.stream()) .distinct() .collect(Collectors.toSet()); // filter out those with a non-exact external name match if (exactMatch) { return filterOnlyExactExternalNameMatches(records, query); } else { return records; } }
private void applyIdentityChanges(SampleIdentity target, SampleIdentity source) throws IOException { if (!source.getExternalName().equals(target.getExternalName())) { confirmExternalNameUniqueForProjectIfRequired(source.getExternalName(), target); Set<String> sourceExternalNames = SampleIdentityImpl.getSetFromString(source.getExternalName()); Set<String> targetExternalNames = SampleIdentityImpl.getSetFromString(target.getExternalName()); if (!sourceExternalNames.containsAll(targetExternalNames) || !targetExternalNames.containsAll(sourceExternalNames)) { target.setExternalName(source.getExternalName()); } } target.setDonorSex(source.getDonorSex()); target.setConsentLevel(source.getConsentLevel()); }
/** * Adds any external names in the sample's attached identity to the identity stored in the database * * @param sample * @throws IOException */ private void addExternalNames(DetailedSample sample, SampleIdentity identityCopy) throws IOException { if (identityCopy == null || identityCopy.getExternalName() == null) return; SampleIdentity identity = (SampleIdentity) get(getIdentity(sample).getId()); Set<String> identityExternalNames = SampleIdentityImpl.getSetFromString(identity.getExternalName()); Set<String> tempExternalNames = SampleIdentityImpl.getSetFromString(identityCopy.getExternalName()); Set<String> lowerCaseIdentityExternalNames = identityExternalNames.stream().map(String::toLowerCase).collect(Collectors.toSet()); for (String name : tempExternalNames) { if (!lowerCaseIdentityExternalNames.contains(name.toLowerCase()) && !(isUniqueExternalNameWithinProjectRequired() && (identity.getProject() == null || getIdentitiesByExternalNameOrAliasAndProject(name, identity.getProject().getId(), true).size() > 0))) { identityExternalNames.add(name); } } if (identityExternalNames.size() > lowerCaseIdentityExternalNames.size()) { identity.setExternalName(String.join(",", identityExternalNames)); identity.setChangeDetails(authorizationManager.getCurrentUser()); sampleStore.update(identity); } }
for (SampleIdentity match : matches) { if (match.getId() != sample.getId()) { Set<String> matchExtNames = SampleIdentityImpl.getSetFromString(match.getExternalName()); Set<String> newExtNames = SampleIdentityImpl.getSetFromString(newExternalName); newExtNames.retainAll(matchExtNames); throw new ConstraintViolationException(