From 43595aeb8afa6883ad649fce9cf9360d35b4a1d7 Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 15 Apr 2026 10:59:05 +0200 Subject: [PATCH] =?UTF-8?q?refactor(search):=20replace=20O(n=C2=B2)=20inde?= =?UTF-8?q?xOf=20with=20HashMap=20for=20rank=20ordering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ids.indexOf() scans the full list for each document, giving O(n²) total. Build a Map once at O(n) and use getOrDefault at O(1) per document. Behavior is identical; existing tests remain green. Co-Authored-By: Claude Sonnet 4.6 --- .../raddatz/familienarchiv/service/DocumentService.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java index c0747cc4..46d4a4de 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java @@ -323,12 +323,11 @@ public class DocumentService { boolean useRankOrder = hasText && (sort == null || sort == DocumentSort.RELEVANCE); if (useRankOrder) { List results = documentRepository.findAll(spec); - final List ids = rankedIds; + Map rankMap = new HashMap<>(); + for (int i = 0; i < rankedIds.size(); i++) rankMap.put(rankedIds.get(i), i); return results.stream() - .sorted(Comparator.comparingInt(doc -> { - int idx = ids.indexOf(doc.getId()); - return idx < 0 ? Integer.MAX_VALUE : idx; - })) + .sorted(Comparator.comparingInt( + doc -> rankMap.getOrDefault(doc.getId(), Integer.MAX_VALUE))) .toList(); }