Skip to content

Commit 17205be

Browse files
Simplify and document move sibling action (#446)
1 parent a90eb68 commit 17205be

File tree

1 file changed

+28
-19
lines changed

1 file changed

+28
-19
lines changed

srv/src/main/java/my/bookshop/handlers/HierarchySiblingActionHandler.java

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.sap.cds.ql.Update;
1111
import com.sap.cds.ql.cqn.CqnAnalyzer;
1212
import com.sap.cds.ql.cqn.CqnSelect;
13-
import com.sap.cds.ql.cqn.CqnUpdate;
1413

1514
import com.sap.cds.services.handler.EventHandler;
1615
import com.sap.cds.services.handler.annotations.On;
@@ -22,11 +21,10 @@
2221
import cds.gen.adminservice.GenreHierarchyMoveSiblingActionContext;
2322
import cds.gen.adminservice.GenreHierarchy_;
2423

25-
2624
@Component
2725
@ServiceName(AdminService_.CDS_NAME)
2826
/**
29-
* Example of a custom handler for nextSiblingAction
27+
* Example of a custom handler for nextSiblingAction
3028
*/
3129
@Profile("hybrid")
3230
public class HierarchySiblingActionHandler implements EventHandler {
@@ -40,27 +38,38 @@ public class HierarchySiblingActionHandler implements EventHandler {
4038
@On(entity = GenreHierarchy_.CDS_NAME)
4139
void onMoveSiblingAction(GenreHierarchyMoveSiblingActionContext event) {
4240
CqnSelect select = event.getCqn();
43-
String toMoveId = (String) CqnAnalyzer.create(event.getModel()).analyze(select).targetKeys().get(GenreHierarchy_.ID);
44-
CqnSelect parentCQN = Select.from(GenreHierarchy_.class).columns(c -> c.parent_ID()).where(c -> c.ID().eq(toMoveId));
45-
GenreHierarchy parentNode = db.run(parentCQN).single(GenreHierarchy.class);
46-
CqnSelect childrenCQN = Select.from(GenreHierarchy_.class).columns(c -> c.ID(), c -> c.siblingRank()).where(c -> c.parent_ID().eq(parentNode.getParentId()));
47-
List<GenreHierarchy> siblingNodes = db.run(childrenCQN).listOf(GenreHierarchy.class);
48-
49-
List<Integer> siblingRanks = siblingNodes.stream().map(ch -> ch.getSiblingRank()).toList();
50-
51-
GenreHierarchy nodeToMove = siblingNodes.stream().filter(el -> toMoveId.equals(el.getId())).findFirst().get();
41+
// Get ID of the entry that is being moved
42+
String idToMove = (String) CqnAnalyzer.create(event.getModel()).analyze(select).targetKeys()
43+
.get(GenreHierarchy_.ID);
44+
// Find its' parent
45+
String parentId = db.run(Select.from(GenreHierarchy_.class)
46+
.columns(c -> c.parent_ID()).where(c -> c.ID().eq(idToMove)))
47+
.single(GenreHierarchy.class).getParentId();
48+
// Find all children of the parent, which are siblings of the entry being moved
49+
List<GenreHierarchy> siblingNodes = db.run(Select.from(GenreHierarchy_.class)
50+
.columns(c -> c.ID(), c -> c.siblingRank())
51+
.where(c -> c.parent_ID().eq(parentId)))
52+
.listOf(GenreHierarchy.class);
53+
54+
// Shift the sibling ranks to reflect the sort order
55+
List<Integer> siblingRanksCopy = siblingNodes.stream().map(ch -> ch.getSiblingRank()).toList();
56+
5257
String nextSiblingId = event.getNextSibling() == null ? null : event.getNextSibling().getId();
53-
Optional <GenreHierarchy> nextSibling = siblingNodes.stream().filter(el -> el.getId().equals(nextSiblingId)).findFirst();
58+
Optional<GenreHierarchy> nextSibling = siblingNodes.stream().filter(el -> el.getId().equals(nextSiblingId))
59+
.findFirst();
5460

61+
GenreHierarchy nodeToMove = siblingNodes.stream().filter(el -> idToMove.equals(el.getId())).findFirst().get();
5562
GenreHierarchy moved = siblingNodes.remove(siblingNodes.indexOf(nodeToMove));
56-
nextSibling.ifPresentOrElse(n -> siblingNodes.add(siblingNodes.indexOf(n), moved), () -> siblingNodes.addLast(moved));
57-
58-
for (int i=0; i < siblingRanks.size(); i++) {
59-
siblingNodes.get(i).setSiblingRank(siblingRanks.get(i));
63+
// Exchange siblings
64+
nextSibling.ifPresentOrElse(n -> siblingNodes.add(siblingNodes.indexOf(n), moved),
65+
() -> siblingNodes.addLast(moved));
66+
// Apply ranks
67+
for (int i = 0; i < siblingRanksCopy.size(); i++) {
68+
siblingNodes.get(i).setSiblingRank(siblingRanksCopy.get(i));
6069
}
6170

62-
CqnUpdate updateCQN = Update.entity(GenreHierarchy_.class).entries(siblingNodes);
63-
db.run(updateCQN);
71+
// Update DB
72+
db.run(Update.entity(GenreHierarchy_.class).entries(siblingNodes));
6473
event.setCompleted();
6574
}
6675
}

0 commit comments

Comments
 (0)