1010import com .sap .cds .ql .Update ;
1111import com .sap .cds .ql .cqn .CqnAnalyzer ;
1212import com .sap .cds .ql .cqn .CqnSelect ;
13- import com .sap .cds .ql .cqn .CqnUpdate ;
1413
1514import com .sap .cds .services .handler .EventHandler ;
1615import com .sap .cds .services .handler .annotations .On ;
2221import cds .gen .adminservice .GenreHierarchyMoveSiblingActionContext ;
2322import 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" )
3230public 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