From e598be69052a75525af7b986462c171a66b5a759 Mon Sep 17 00:00:00 2001 From: Evgeny Andreev Date: Tue, 27 May 2025 11:34:34 +0200 Subject: [PATCH 1/3] fix for local hierarchies --- .../bookshop/handlers/HierarchyHandler.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java b/srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java index 4ffe06c3..70927da5 100644 --- a/srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java +++ b/srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java @@ -1,5 +1,7 @@ package my.bookshop.handlers; +import static cds.gen.catalogservice.CatalogService_.GENRE_HIERARCHY; + import java.util.ArrayDeque; import java.util.Comparator; import java.util.Deque; @@ -21,12 +23,12 @@ import com.sap.cds.ql.cqn.CqnSelect; import com.sap.cds.ql.cqn.CqnValue; import com.sap.cds.ql.cqn.Modifier; -import com.sap.cds.ql.cqn.transformation.CqnTopLevelsTransformation; import com.sap.cds.ql.cqn.transformation.CqnAncestorsTransformation; import com.sap.cds.ql.cqn.transformation.CqnDescendantsTransformation; import com.sap.cds.ql.cqn.transformation.CqnFilterTransformation; -import com.sap.cds.ql.cqn.transformation.CqnSearchTransformation; import com.sap.cds.ql.cqn.transformation.CqnOrderByTransformation; +import com.sap.cds.ql.cqn.transformation.CqnSearchTransformation; +import com.sap.cds.ql.cqn.transformation.CqnTopLevelsTransformation; import com.sap.cds.ql.cqn.transformation.CqnTransformation; import com.sap.cds.services.cds.CdsReadEventContext; import com.sap.cds.services.cds.CqnService; @@ -35,15 +37,14 @@ import com.sap.cds.services.handler.annotations.ServiceName; import com.sap.cds.services.persistence.PersistenceService; +import cds.gen.adminservice.AdminService_; import cds.gen.catalogservice.CatalogService_; import cds.gen.catalogservice.GenreHierarchy; import cds.gen.catalogservice.GenreHierarchy_; -import static cds.gen.catalogservice.CatalogService_.GENRE_HIERARCHY; - @Component @Profile("default") // non-HANA -@ServiceName(CatalogService_.CDS_NAME) +@ServiceName({ CatalogService_.CDS_NAME, AdminService_.CDS_NAME }) /** * On HANA, requests for GenreHierarchy are handled generically. * @@ -62,7 +63,7 @@ public class HierarchyHandler implements EventHandler { this.db = db; } - @Before(event = CqnService.EVENT_READ, entity = GenreHierarchy_.CDS_NAME) + @Before(event = CqnService.EVENT_READ) public void readGenreHierarchy(CdsReadEventContext event) { List trafos = event.getCqn().transformations(); List result = null; @@ -71,6 +72,12 @@ public void readGenreHierarchy(CdsReadEventContext event) { return; } + // Fallback for draft-enabled scenario: plain table + if (cds.gen.adminservice.GenreHierarchy_.CDS_NAME.equals(event.getTarget().getQualifiedName())) { + event.setResult(db.run(Select.from(cds.gen.adminservice.GenreHierarchy_.class))); + return; + } + if (getTopLevels(trafos) instanceof CqnTopLevelsTransformation topLevels) { result = topLevels(topLevels, CQL.TRUE); } else if (trafos.get(0) instanceof CqnDescendantsTransformation descendants) { From cea58d11405fa313f85b425123987436c6f27be6 Mon Sep 17 00:00:00 2001 From: Evgeny Andreev Date: Tue, 27 May 2025 13:52:26 +0200 Subject: [PATCH 2/3] fallback --- .../hierarchy/HierarchyFallbackHandler.java | 39 +++++++++++++++++++ .../HierarchyReadOnlyHandler.java} | 17 +++----- .../HierarchyHandlerSorterTest.java | 4 +- 3 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyFallbackHandler.java rename srv/src/main/java/my/bookshop/handlers/{HierarchyHandler.java => hierarchy/HierarchyReadOnlyHandler.java} (95%) rename srv/src/test/java/my/bookshop/handlers/{ => hierarchy}/HierarchyHandlerSorterTest.java (94%) diff --git a/srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyFallbackHandler.java b/srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyFallbackHandler.java new file mode 100644 index 00000000..691e6af9 --- /dev/null +++ b/srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyFallbackHandler.java @@ -0,0 +1,39 @@ +package my.bookshop.handlers.hierarchy; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import com.sap.cds.ql.Select; +import com.sap.cds.services.cds.CdsReadEventContext; +import com.sap.cds.services.cds.CqnService; +import com.sap.cds.services.handler.EventHandler; +import com.sap.cds.services.handler.annotations.Before; +import com.sap.cds.services.handler.annotations.ServiceName; +import com.sap.cds.services.persistence.PersistenceService; + +import cds.gen.adminservice.AdminService_; +import cds.gen.adminservice.GenreHierarchy_; + +@Component +@Profile("default") // non-HANA +@ServiceName(AdminService_.CDS_NAME) +/** + * Fallback to plain representation + */ +public class HierarchyFallbackHandler implements EventHandler { + + private final PersistenceService db; + + HierarchyFallbackHandler(PersistenceService db) { + this.db = db; + } + + @Before(event = CqnService.EVENT_READ, entity = GenreHierarchy_.CDS_NAME) + public void readGenreHierarchy(CdsReadEventContext event) { + if (event.getCqn().transformations().size() < 1) { + return; + } + event.setResult(db.run(Select.from(cds.gen.adminservice.GenreHierarchy_.class))); + } + +} diff --git a/srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java b/srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyReadOnlyHandler.java similarity index 95% rename from srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java rename to srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyReadOnlyHandler.java index 70927da5..c0fed47d 100644 --- a/srv/src/main/java/my/bookshop/handlers/HierarchyHandler.java +++ b/srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyReadOnlyHandler.java @@ -1,4 +1,4 @@ -package my.bookshop.handlers; +package my.bookshop.handlers.hierarchy; import static cds.gen.catalogservice.CatalogService_.GENRE_HIERARCHY; @@ -37,14 +37,13 @@ import com.sap.cds.services.handler.annotations.ServiceName; import com.sap.cds.services.persistence.PersistenceService; -import cds.gen.adminservice.AdminService_; import cds.gen.catalogservice.CatalogService_; import cds.gen.catalogservice.GenreHierarchy; import cds.gen.catalogservice.GenreHierarchy_; @Component @Profile("default") // non-HANA -@ServiceName({ CatalogService_.CDS_NAME, AdminService_.CDS_NAME }) +@ServiceName(CatalogService_.CDS_NAME) /** * On HANA, requests for GenreHierarchy are handled generically. * @@ -55,15 +54,15 @@ * The handler is neither functionally complete nor correct for all requests. It * is not intended as a blue-print for custom code. */ -public class HierarchyHandler implements EventHandler { +public class HierarchyReadOnlyHandler implements EventHandler { private final PersistenceService db; - HierarchyHandler(PersistenceService db) { + HierarchyReadOnlyHandler(PersistenceService db) { this.db = db; } - @Before(event = CqnService.EVENT_READ) + @Before(event = CqnService.EVENT_READ, entity = GenreHierarchy_.CDS_NAME) public void readGenreHierarchy(CdsReadEventContext event) { List trafos = event.getCqn().transformations(); List result = null; @@ -72,12 +71,6 @@ public void readGenreHierarchy(CdsReadEventContext event) { return; } - // Fallback for draft-enabled scenario: plain table - if (cds.gen.adminservice.GenreHierarchy_.CDS_NAME.equals(event.getTarget().getQualifiedName())) { - event.setResult(db.run(Select.from(cds.gen.adminservice.GenreHierarchy_.class))); - return; - } - if (getTopLevels(trafos) instanceof CqnTopLevelsTransformation topLevels) { result = topLevels(topLevels, CQL.TRUE); } else if (trafos.get(0) instanceof CqnDescendantsTransformation descendants) { diff --git a/srv/src/test/java/my/bookshop/handlers/HierarchyHandlerSorterTest.java b/srv/src/test/java/my/bookshop/handlers/hierarchy/HierarchyHandlerSorterTest.java similarity index 94% rename from srv/src/test/java/my/bookshop/handlers/HierarchyHandlerSorterTest.java rename to srv/src/test/java/my/bookshop/handlers/hierarchy/HierarchyHandlerSorterTest.java index 57ea139d..091ca7bd 100644 --- a/srv/src/test/java/my/bookshop/handlers/HierarchyHandlerSorterTest.java +++ b/srv/src/test/java/my/bookshop/handlers/hierarchy/HierarchyHandlerSorterTest.java @@ -1,11 +1,11 @@ -package my.bookshop.handlers; +package my.bookshop.handlers.hierarchy; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import org.junit.jupiter.api.Test; import cds.gen.catalogservice.GenreHierarchy; -import my.bookshop.handlers.HierarchyHandler.Sorter; +import my.bookshop.handlers.hierarchy.HierarchyReadOnlyHandler.Sorter; public class HierarchyHandlerSorterTest { From 6751f62beb441e8b5b2913c22fe40e16c2449a0d Mon Sep 17 00:00:00 2001 From: Marc Becker Date: Tue, 27 May 2025 14:05:40 +0200 Subject: [PATCH 3/3] Update srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyFallbackHandler.java --- .../bookshop/handlers/hierarchy/HierarchyFallbackHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyFallbackHandler.java b/srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyFallbackHandler.java index 691e6af9..e14a381e 100644 --- a/srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyFallbackHandler.java +++ b/srv/src/main/java/my/bookshop/handlers/hierarchy/HierarchyFallbackHandler.java @@ -33,7 +33,7 @@ public void readGenreHierarchy(CdsReadEventContext event) { if (event.getCqn().transformations().size() < 1) { return; } - event.setResult(db.run(Select.from(cds.gen.adminservice.GenreHierarchy_.class))); + event.setResult(db.run(Select.from(GenreHierarchy_.class))); } }