Skip to content

Commit

Permalink
#8485 - ad firstname and lastname to free text search of fetching sim…
Browse files Browse the repository at this point in the history
…ilar persons for person search and pick or create person
  • Loading branch information
BarnaBartha committed Oct 14, 2022
1 parent f34a7c8 commit 3658312
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,47 +6,15 @@
@SuppressWarnings("serial")
public class PersonSimilarityCriteria extends BaseCriteria implements Cloneable {

public static final String FIRST_NAME = "firstName";
public static final String LAST_NAME = "lastName";
public static final String UUID_EXTERNAL_ID_EXTERNAL_TOKEN_LIKE = "uuidExternalIdExternalTokenLike";
public static final String NAME_UUID_EXTERNAL_ID_EXTERNAL_TOKEN_LIKE = "nameUuidExternalIdExternalTokenLike";

private String firstName;
private String lastName;
private Sex sex;
private Integer birthdateYYYY;
private Integer birthdateMM;
private Integer birthdateDD;
private String passportNumber;
private String nationalHealthId;
private String uuidExternalIdExternalTokenLike;

@IgnoreForUrl
public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public PersonSimilarityCriteria firstName(String firstName) {
this.firstName = firstName;
return this;
}

@IgnoreForUrl
public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public PersonSimilarityCriteria lastName(String lastName) {
this.lastName = lastName;
return this;
}
private String nameUuidExternalIdExternalTokenLike;

@IgnoreForUrl
public Sex getSex() {
Expand Down Expand Up @@ -108,22 +76,27 @@ public PersonSimilarityCriteria nationalHealthId(String nationalHealthId) {
return this;
}

public String getUuidExternalIdExternalTokenLike() {
return uuidExternalIdExternalTokenLike;
public String getNameUuidExternalIdExternalTokenLike() {
return nameUuidExternalIdExternalTokenLike;
}

public void setNameUuidExternalIdExternalTokenLike(String nameUuidExternalIdExternalTokenLike) {
this.nameUuidExternalIdExternalTokenLike = nameUuidExternalIdExternalTokenLike;
}

public void setUuidExternalIdExternalTokenLike(String uuidExternalIdExternalTokenLike) {
this.uuidExternalIdExternalTokenLike = uuidExternalIdExternalTokenLike;
public void setName(PersonDto person) {
this.nameUuidExternalIdExternalTokenLike = person.getFirstName() + " " + person.getLastName();
}

public static PersonSimilarityCriteria forPerson(PersonDto person) {
return new PersonSimilarityCriteria().firstName(person.getFirstName())
.lastName(person.getLastName())
.sex(person.getSex())
.birthdateDD(person.getBirthdateDD())
.birthdateMM(person.getBirthdateMM())
.birthdateYYYY(person.getBirthdateYYYY())
.passportNumber(person.getPassportNumber())
.nationalHealthId(person.getNationalHealthId());
PersonSimilarityCriteria personSimilarityCriteria = new PersonSimilarityCriteria()
.sex(person.getSex())
.birthdateDD(person.getBirthdateDD())
.birthdateMM(person.getBirthdateMM())
.birthdateYYYY(person.getBirthdateYYYY())
.passportNumber(person.getPassportNumber())
.nationalHealthId(person.getNationalHealthId());
personSimilarityCriteria.setNameUuidExternalIdExternalTokenLike(person.getFirstName() + " " + person.getLastName());
return personSimilarityCriteria;
}
}
2 changes: 1 addition & 1 deletion sormas-api/src/main/resources/strings.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1410,7 +1410,7 @@ promptAllDistricts=All districts
promptAllCommunities=All communities
promptExternalIdExternalSurveillanceTool=Will adopt external reporting tool GUID
promptExternalJournalForceDeletion=Do you want to force the cancellation in SORMAS? This would mark the person as deleted from the external journal in SORMAS, while there is a high probability of personal data still remaining in the external journal.
promptPersonDuplicateSearchIdExternalId=ID, External ID, External token
promptPersonDuplicateSearchIdExternalId=Firstname, Lastname, ID, External ID, External token
#DiseaseNetworkDiagram
DiseaseNetworkDiagram.Classification.HEALTHY = Healthy
DiseaseNetworkDiagram.heading = Disease network diagram
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -759,25 +759,6 @@ public Predicate buildSimilarityCriteriaFilter(PersonSimilarityCriteria criteria

Predicate filter = null;

if (!StringUtils.isBlank(criteria.getFirstName()) && !StringUtils.isBlank(criteria.getLastName())) {
Expression<String> nameExpr = cb.concat(personFrom.get(Person.FIRST_NAME), " ");
nameExpr = cb.concat(nameExpr, personFrom.get(Person.LAST_NAME));

String name = criteria.getFirstName() + " " + criteria.getLastName();

filter = and(cb, filter, cb.isTrue(cb.function(SIMILARITY_OPERATOR, boolean.class, nameExpr, cb.literal(name))));
} else if (!StringUtils.isBlank(criteria.getFirstName())) {
filter = and(
cb,
filter,
cb.isTrue(cb.function(SIMILARITY_OPERATOR, boolean.class, personFrom.get(Person.FIRST_NAME), cb.literal(criteria.getFirstName()))));
} else if (!StringUtils.isBlank(criteria.getLastName())) {
filter = and(
cb,
filter,
cb.isTrue(cb.function(SIMILARITY_OPERATOR, boolean.class, personFrom.get(Person.LAST_NAME), cb.literal(criteria.getLastName()))));
}

if (criteria.getSex() != null) {
Expression<Sex> sexExpr = cb.literal(criteria.getSex());

Expand Down Expand Up @@ -821,16 +802,28 @@ public Predicate buildSimilarityCriteriaFilter(PersonSimilarityCriteria criteria
filter = CriteriaBuilderHelper.or(cb, filter, cb.equal(personFrom.get(Person.PASSPORT_NUMBER), criteria.getPassportNumber()));
}

String uuidExternalIdExternalTokenLike = criteria.getUuidExternalIdExternalTokenLike();
String uuidExternalIdExternalTokenLike = criteria.getNameUuidExternalIdExternalTokenLike();
if (!StringUtils.isBlank(uuidExternalIdExternalTokenLike)) {
Predicate uuidExternalIdExternalTokenFilter = CriteriaBuilderHelper.buildFreeTextSearchPredicate(
cb,
uuidExternalIdExternalTokenLike,
(searchTerm) -> cb.or(
CriteriaBuilderHelper.ilike(cb, personFrom.get(Person.UUID), searchTerm),
CriteriaBuilderHelper.ilike(cb, personFrom.get(Person.EXTERNAL_ID), searchTerm),
CriteriaBuilderHelper.ilike(cb, personFrom.get(Person.EXTERNAL_TOKEN), searchTerm)));
filter = CriteriaBuilderHelper.or(cb, filter, uuidExternalIdExternalTokenFilter);

String[] textFilters = uuidExternalIdExternalTokenLike.split("\\s+");

for (String textFilter : textFilters) {
if (DataHelper.isNullOrEmpty(textFilter)) {
continue;
}

Predicate likeFilters = cb.or(
CriteriaBuilderHelper.unaccentedIlike(cb, personFrom.get(Person.FIRST_NAME), textFilter),
CriteriaBuilderHelper.unaccentedIlike(cb, personFrom.get(Person.LAST_NAME), textFilter),
cb.isTrue(cb.function(SIMILARITY_OPERATOR, boolean.class, personFrom.get(Person.FIRST_NAME), cb.literal(textFilter))),
cb.isTrue(cb.function(SIMILARITY_OPERATOR, boolean.class, personFrom.get(Person.LAST_NAME), cb.literal(textFilter))),
CriteriaBuilderHelper.ilike(cb, personFrom.get(Person.UUID), textFilter),
CriteriaBuilderHelper.ilike(cb, personFrom.get(Person.INTERNAL_TOKEN), textFilter),
CriteriaBuilderHelper.ilike(cb, personFrom.get(Person.EXTERNAL_ID), textFilter),
CriteriaBuilderHelper.ilike(cb, personFrom.get(Person.EXTERNAL_TOKEN), textFilter));

filter = CriteriaBuilderHelper.and(cb, filter, likeFilters);
}
}

return filter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,8 +249,7 @@ protected void addFilterForm() {

final PersonSimilarityCriteria searchCriteria = new PersonSimilarityCriteria();
if (referencePerson != null) {
searchCriteria.setFirstName(referencePerson.getFirstName());
searchCriteria.setLastName(referencePerson.getLastName());
searchCriteria.setName(referencePerson);
}
filterForm.setValue(searchCriteria);
filterForm.addApplyHandler((e) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,15 @@ protected PersonSelectionFilterForm() {
@Override
protected String[] getMainFilterLocators() {
return new String[] {
PersonSimilarityCriteria.FIRST_NAME,
PersonSimilarityCriteria.LAST_NAME,
PersonSimilarityCriteria.UUID_EXTERNAL_ID_EXTERNAL_TOKEN_LIKE };
PersonSimilarityCriteria.NAME_UUID_EXTERNAL_ID_EXTERNAL_TOKEN_LIKE };
}

@Override
protected void addFields() {
addField(
FieldConfiguration.withCaptionAndPixelSized(PersonSimilarityCriteria.FIRST_NAME, I18nProperties.getCaption(Captions.firstName), 100));
addField(FieldConfiguration.withCaptionAndPixelSized(PersonSimilarityCriteria.LAST_NAME, I18nProperties.getCaption(Captions.lastName), 100));

addField(
FieldConfiguration.withCaptionAndPixelSized(
PersonSimilarityCriteria.UUID_EXTERNAL_ID_EXTERNAL_TOKEN_LIKE,
PersonSimilarityCriteria.NAME_UUID_EXTERNAL_ID_EXTERNAL_TOKEN_LIKE,
I18nProperties.getString(Strings.promptPersonDuplicateSearchIdExternalId),
150)).addStyleName(CssStyles.HSPACE_RIGHT_3);
}
Expand Down

0 comments on commit 3658312

Please sign in to comment.