From 4ec4062274fdf5ebcc4da9f2feb0f8206b966035 Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 17 Apr 2026 07:45:40 +0200 Subject: [PATCH] refactor(#248): simplify TagService.buildTree() to single-pass LinkedHashMap approach Co-Authored-By: Claude Sonnet 4.6 --- .../familienarchiv/service/TagService.java | 40 +++++-------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/TagService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/TagService.java index b82b0be5..042b7943 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/TagService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/TagService.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -208,39 +209,20 @@ public class TagService { } private List buildTree(List tags, Map counts) { - Map> childrenByParent = new HashMap<>(); - - for (Tag tag : tags) { - childrenByParent.putIfAbsent(tag.getId(), new ArrayList<>()); - if (tag.getParentId() != null) { - childrenByParent.computeIfAbsent(tag.getParentId(), k -> new ArrayList<>()); - } - } - + Map nodeById = new LinkedHashMap<>(); for (Tag tag : tags) { int documentCount = counts.getOrDefault(tag.getId(), 0L).intValue(); - TagTreeNodeDTO node = new TagTreeNodeDTO( + nodeById.put(tag.getId(), new TagTreeNodeDTO( tag.getId(), tag.getName(), tag.getColor(), documentCount, - childrenByParent.getOrDefault(tag.getId(), new ArrayList<>()), - tag.getParentId() - ); - if (tag.getParentId() != null) { - childrenByParent.get(tag.getParentId()).add(node); + new ArrayList<>(), tag.getParentId() + )); + } + for (TagTreeNodeDTO node : nodeById.values()) { + if (node.parentId() != null) { + TagTreeNodeDTO parent = nodeById.get(node.parentId()); + if (parent != null) parent.children().add(node); } } - - // Collect root nodes (tags without a parent) - List roots = new ArrayList<>(); - for (Tag tag : tags) { - if (tag.getParentId() == null) { - int documentCount = counts.getOrDefault(tag.getId(), 0L).intValue(); - roots.add(new TagTreeNodeDTO( - tag.getId(), tag.getName(), tag.getColor(), documentCount, - childrenByParent.getOrDefault(tag.getId(), new ArrayList<>()), - null - )); - } - } - return roots; + return nodeById.values().stream().filter(n -> n.parentId() == null).toList(); } }