diff --git a/srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java b/srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java index 65c12aad..6780d8d3 100644 --- a/srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java +++ b/srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java @@ -169,11 +169,13 @@ private void addIfNotNull(Set ancestorIds, Row r, String key) { } private List topLevels(CqnTopLevelsTransformation topLevels, CqnPredicate filter) { - return topLevels.levels() < 0 || !(topLevels.expandLevels().isEmpty()) ? topLevelsAll(filter) : topLevelsLimit(topLevels.levels(), filter); + return topLevels.levels() < 0 ? topLevelsAll(filter) : topLevelsLimit(topLevels, filter); } - private List topLevelsLimit(long limit, CqnPredicate filter) { + private List topLevelsLimit(CqnTopLevelsTransformation topLevels, CqnPredicate filter) { + long limit = topLevels.levels(); Map lookup = new HashMap<>(); + Map expandLevels = topLevels.expandLevels(); CqnSelect getRoots = Select.from(AdminService_.GENRE_HIERARCHY).where(gh -> gh.parent_id().eq(0).and(filter)); List roots = db.run(getRoots).listOf(GenreHierarchy.class); @@ -197,6 +199,23 @@ private List topLevelsLimit(long limit, CqnPredicate filter) { } }); + if (!expandLevels.isEmpty()) { + List expandedIds = expandLevels.keySet().stream().map(key -> (Integer) key).toList(); + CqnSelect expandedCQN = Select.from(AdminService_.GENRE_HIERARCHY).where(gh -> + CQL.and(filter, + CQL.or(gh.node_id().in(expandedIds), gh.parent_id().in(expandedIds)))); + + List expanded = db.run(expandedCQN).listOf(GenreHierarchy.class); + expanded.forEach(gh -> { + if (!lookup.keySet().contains(gh.getNodeId())) { + gh.setParent(lookup.get(gh.getParentId())); + gh.setDistanceFromRoot(distanceFromRoot(gh)); + lookup.put(gh.getNodeId(), gh); + } + }); + + } + return lookup.values().stream().sorted(new Sorter()).toList(); }