Skip to content

Commit c2174cb

Browse files
committed
custom handler for nextSiblingAction
1 parent 018d0a2 commit c2174cb

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

srv/admin-service.cds

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ service AdminService @(requires: 'admin') {
2828
entity GenreHierarchy as projection on my.Genres
2929
excluding {children} order by siblingRank
3030
actions {
31-
action moveSiblingAction(NextSibling : NextSibling) returns GenreHierarchy;
31+
action moveSiblingAction(NextSibling : NextSibling);
3232
};
3333

3434
extend my.Contents with Hierarchy;
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package my.bookshop.handlers;
2+
3+
import java.util.List;
4+
import java.util.Optional;
5+
6+
import org.springframework.context.annotation.Profile;
7+
import org.springframework.stereotype.Component;
8+
9+
import com.sap.cds.ql.Select;
10+
import com.sap.cds.ql.Update;
11+
import com.sap.cds.ql.cqn.CqnAnalyzer;
12+
import com.sap.cds.ql.cqn.CqnSelect;
13+
import com.sap.cds.ql.cqn.CqnUpdate;
14+
15+
import com.sap.cds.services.handler.EventHandler;
16+
import com.sap.cds.services.handler.annotations.On;
17+
import com.sap.cds.services.handler.annotations.ServiceName;
18+
import com.sap.cds.services.persistence.PersistenceService;
19+
20+
import cds.gen.adminservice.AdminService_;
21+
import cds.gen.adminservice.GenreHierarchy;
22+
import cds.gen.adminservice.GenreHierarchyMoveSiblingActionContext;
23+
import cds.gen.adminservice.GenreHierarchy_;
24+
25+
26+
@Component
27+
@ServiceName(AdminService_.CDS_NAME)
28+
/**
29+
* Example of a custom handler for nextSiblingAction
30+
*/
31+
@Profile("hybrid")
32+
public class HierarchySiblingActionHandler implements EventHandler {
33+
34+
private final PersistenceService db;
35+
36+
HierarchySiblingActionHandler(PersistenceService db) {
37+
this.db = db;
38+
}
39+
40+
@On(entity = GenreHierarchy_.CDS_NAME)
41+
void onMoveSiblingAction(GenreHierarchyMoveSiblingActionContext event) {
42+
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();
52+
String nextSiblingId = event.getNextSibling() == null ? null : event.getNextSibling().getId();
53+
Optional <GenreHierarchy> nextSibling = siblingNodes.stream().filter(el -> el.getId().equals(nextSiblingId)).findFirst();
54+
55+
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));
60+
}
61+
62+
CqnUpdate updateCQN = Update.entity(GenreHierarchy_.class).entries(siblingNodes);
63+
db.run(updateCQN);
64+
event.setCompleted();
65+
}
66+
}

0 commit comments

Comments
 (0)