refactor: address PR review concerns
- Remove Architekt from WORD_PREFIXES (classifier handles it) - Use Objects.equals for null-safe firstName/lastName comparison - Remove unused trimmed variable in PersonTypeClassifier - Fix containsWord to loop through all occurrences (finds "Eltern" in "Nachbareltern Eltern") - Extract DisplayNameFormatter utility shared by Person and PersonSummaryDTO to eliminate display logic duplication Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -20,10 +20,7 @@ public interface PersonSummaryDTO {
|
|||||||
long getDocumentCount();
|
long getDocumentCount();
|
||||||
|
|
||||||
default String getDisplayName() {
|
default String getDisplayName() {
|
||||||
StringBuilder sb = new StringBuilder();
|
return org.raddatz.familienarchiv.model.DisplayNameFormatter.format(
|
||||||
if (getTitle() != null) sb.append(getTitle()).append(" ");
|
getTitle(), getFirstName(), getLastName());
|
||||||
if (getFirstName() != null) sb.append(getFirstName()).append(" ");
|
|
||||||
sb.append(getLastName());
|
|
||||||
return sb.toString().trim();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package org.raddatz.familienarchiv.model;
|
||||||
|
|
||||||
|
public class DisplayNameFormatter {
|
||||||
|
|
||||||
|
public static String format(String title, String firstName, String lastName) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (title != null) sb.append(title).append(" ");
|
||||||
|
if (firstName != null) sb.append(firstName).append(" ");
|
||||||
|
sb.append(lastName);
|
||||||
|
return sb.toString().trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -58,10 +58,6 @@ public class Person {
|
|||||||
@Transient
|
@Transient
|
||||||
@Schema(accessMode = Schema.AccessMode.READ_ONLY, requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(accessMode = Schema.AccessMode.READ_ONLY, requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
public String getDisplayName() {
|
public String getDisplayName() {
|
||||||
StringBuilder sb = new StringBuilder();
|
return DisplayNameFormatter.format(title, firstName, lastName);
|
||||||
if (title != null) sb.append(title).append(" ");
|
|
||||||
if (firstName != null) sb.append(firstName).append(" ");
|
|
||||||
sb.append(lastName);
|
|
||||||
return sb.toString().trim();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,7 @@ package org.raddatz.familienarchiv.service;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -159,7 +160,7 @@ public class PersonNameParser {
|
|||||||
if ("?".equals(lastName) && !cleaned.contains(" ")) {
|
if ("?".equals(lastName) && !cleaned.contains(" ")) {
|
||||||
lastName = firstName;
|
lastName = firstName;
|
||||||
firstName = null;
|
firstName = null;
|
||||||
} else if (firstName.equals(lastName)) {
|
} else if (Objects.equals(firstName, lastName)) {
|
||||||
firstName = null;
|
firstName = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -217,7 +218,7 @@ public class PersonNameParser {
|
|||||||
"Frau", "Herr", "Freifrau", "Freiherr",
|
"Frau", "Herr", "Freifrau", "Freiherr",
|
||||||
"Tante", "Onkel", "Schwester", "Bruder",
|
"Tante", "Onkel", "Schwester", "Bruder",
|
||||||
"Cousine", "Cousin", "Freundin", "Freund",
|
"Cousine", "Cousin", "Freundin", "Freund",
|
||||||
"Mutter", "Vater", "Pastor", "Architekt");
|
"Mutter", "Vater", "Pastor");
|
||||||
|
|
||||||
/** Strips known title/relationship prefixes, looping for stacked titles. */
|
/** Strips known title/relationship prefixes, looping for stacked titles. */
|
||||||
public static TitleResult stripTitle(String input) {
|
public static TitleResult stripTitle(String input) {
|
||||||
|
|||||||
@@ -24,8 +24,7 @@ public class PersonTypeClassifier {
|
|||||||
public static PersonType classify(String rawName) {
|
public static PersonType classify(String rawName) {
|
||||||
if (rawName == null || rawName.isBlank()) return PersonType.PERSON;
|
if (rawName == null || rawName.isBlank()) return PersonType.PERSON;
|
||||||
|
|
||||||
String trimmed = rawName.trim();
|
String lower = rawName.trim().toLowerCase();
|
||||||
String lower = trimmed.toLowerCase();
|
|
||||||
|
|
||||||
for (String keyword : SKIP_KEYWORDS) {
|
for (String keyword : SKIP_KEYWORDS) {
|
||||||
if (lower.startsWith(keyword.toLowerCase())) return PersonType.SKIP;
|
if (lower.startsWith(keyword.toLowerCase())) return PersonType.SKIP;
|
||||||
@@ -50,11 +49,15 @@ public class PersonTypeClassifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean containsWord(String text, String word) {
|
private static boolean containsWord(String text, String word) {
|
||||||
int idx = text.indexOf(word);
|
int fromIndex = 0;
|
||||||
if (idx < 0) return false;
|
while (true) {
|
||||||
boolean startOk = idx == 0 || !Character.isLetter(text.charAt(idx - 1));
|
int idx = text.indexOf(word, fromIndex);
|
||||||
int end = idx + word.length();
|
if (idx < 0) return false;
|
||||||
boolean endOk = end >= text.length() || !Character.isLetter(text.charAt(end));
|
boolean startOk = idx == 0 || !Character.isLetter(text.charAt(idx - 1));
|
||||||
return startOk && endOk;
|
int end = idx + word.length();
|
||||||
|
boolean endOk = end >= text.length() || !Character.isLetter(text.charAt(end));
|
||||||
|
if (startOk && endOk) return true;
|
||||||
|
fromIndex = idx + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,4 +86,9 @@ class PersonTypeClassifierTest {
|
|||||||
void classify_caseInsensitive() {
|
void classify_caseInsensitive() {
|
||||||
assertThat(PersonTypeClassifier.classify("firma auschrath")).isEqualTo(PersonType.INSTITUTION);
|
assertThat(PersonTypeClassifier.classify("firma auschrath")).isEqualTo(PersonType.INSTITUTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void classify_containsWord_findsSecondOccurrence() {
|
||||||
|
assertThat(PersonTypeClassifier.classify("Nachbareltern Eltern")).isEqualTo(PersonType.GROUP);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user