From c46a82d0f89d136e38d1837d64c9820195846cdd Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Fri, 26 Feb 2021 16:34:21 +0100 Subject: [PATCH] Codetour for DB functions --- .tours/db-native.tour | 105 ++++++++++++++++++++++++++++++++++++++++++ fiori/package.json | 12 ++++- 2 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 .tours/db-native.tour diff --git a/.tours/db-native.tour b/.tours/db-native.tour new file mode 100644 index 00000000..f0b0e9a4 --- /dev/null +++ b/.tours/db-native.tour @@ -0,0 +1,105 @@ +{ + "$schema": "https://aka.ms/codetour-schema", + "title": "Database Functions", + "steps": [ + { + "title": "Introduction", + "description": "### Database Functions in CDS Models\n\nIn this tour, you will learn how to add database-specific funtions to CDS models in your application." + }, + { + "file": "bookshop/db/schema.cds", + "description": "#### Basic Schema\n\nWe want to add 2 fields to the `Authors` entity, one for the author's age and one for the span of years that she or he lived. These 2 fields can be computed out of the existing `dateOfBirth` and `dateOfDeath` fields.", + "selection": { + "start": { + "line": 19, + "character": 1 + }, + "end": { + "line": 21, + "character": 1 + } + }, + "title": "Base fields in Author" + }, + { + "file": "bookshop/srv/admin-service.cds", + "description": "This is how the `Authors` entity gets exposed in an OData or Rest service.\n\nIn the next step you will see how we extend this projection.", + "selection": { + "start": { + "line": 4, + "character": 1 + }, + "end": { + "line": 5, + "character": 1 + } + }, + "title": "Authors service" + }, + { + "file": "fiori/db/sqlite/index.cds", + "description": "#### SQLite implementation\n\nHere is the first implementation for SQLite. It computes the 2 fields `age` and `lifetime` through SQLite's [strftime](https://sqlite.org/lang_datefunc.html) function.\n\nThrough the [`extend projection`](https://cap.cloud.sap/docs/cds/cdl#extend-view) clause you can add additional fields to projection entities. These are deployed as database views, which is why we can integrate the database functions in the first place.", + "selection": { + "start": { + "line": 7, + "character": 1 + }, + "end": { + "line": 11, + "character": 1 + } + }, + "title": "SQLite implementation" + }, + { + "file": "fiori/db/hana/index.cds", + "description": "#### SAP HANA Implementation\n\nThis is the second implementation for SAP HANA. It computes the same 2 fields `age` and `lifetime` through the [YEARS_BETWEEN](https://help.sap.com/viewer/7c78579ce9b14a669c1f3295b0d8ca16/Cloud/en-US/7c0d2c161ea34def86de3f5eadd6a0af.html) and [YEAR](https://help.sap.com/viewer/7c78579ce9b14a669c1f3295b0d8ca16/Cloud/en-US/20f5fac6751910148dabd3c6821f907d.html) functions of SAP HANA.\n\n#### File Layout\n\nNote the path of the `.cds` file we are in: it's in a subfolder of `db`, so that it's _not_ automatically picked up when we start the application. The same is true for the SQLite implementation: it's in a separate `db/sqlite/`\nfolder as well. In the next step you will see how these files are loaded.", + "selection": { + "start": { + "line": 7, + "character": 1 + }, + "end": { + "line": 11, + "character": 1 + } + }, + "title": "SAP HANA implementation" + }, + { + "file": "fiori/package.json", + "description": "The `cds` section in `package.json` is a place to configure which of the `db/sqlite` and `db/hana` folders are used for which database.\nWe use [Node.js profiles](https://cap.cloud.sap/docs/node.js/cds-env#profiles) to separate the configuration.\nIn the `development` profile, you can see that `db/sqlite` is set as the model, while the `db/hana` folder is configured in the `production` profile.", + "line": 17, + "title": "Configuration" + }, + { + "file": "fiori/package.json", + "description": "To run with `development` and an in-memory SQLite database, you don'y need to do anything special, because it's activated by default. Just run\n\n>> cds watch fiori\n\nThen open http://localhost:4004/admin/Authors to see the 2 new fields.\n", + "line": 28, + "title": "Run with SQLite" + }, + { + "file": "fiori/package.json", + "description": "#### Deploy the CDS model to SAP HANA:\n\nTo 'activate' SAP HANA through the `production` profile, you can use the global `--production` flag:\n\n>> cd fiori; cds deploy --to hana --production\n\n[Learn more about SAP HANA deployment](https://cap.cloud.sap/docs/guides/databases#get-hana)\n\n#### Run the application\n\n>> cd fiori; cds watch --production\n\nThe service on http://localhost:4004/admin/Authors is the same as before, but this time the `Authors` entity is backed by a database view with an SAP HANA function.\n\n#### More\nIf you don't see data, you can add some in the next step.", + "line": 31, + "title": "Run with SAP HANA" + }, + { + "file": "fiori/test/requests.http", + "description": "### Add more data\n\nOptionally you may add some data by clicking on the _Send Request_ link (provided by the [Rest client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) extension).\n\n### Summary\n\nThat's it! You have seen \n- How to integrate database-specific functions in a CDS model\n- How to switch between the two implementations for SQLite and SAP HANA.", + "line": 68, + "selection": { + "start": { + "line": 67, + "character": 1 + }, + "end": { + "line": 73, + "character": 1 + } + }, + "title": "Wrap-up" + } + ], + "ref": "master" +} \ No newline at end of file diff --git a/fiori/package.json b/fiori/package.json index 7cbf5f3b..5da44c3c 100644 --- a/fiori/package.json +++ b/fiori/package.json @@ -15,12 +15,20 @@ "watch": "cds watch" }, "cds": { + "hana": { + "deploy-format": "hdbtable" + }, "requires": { + "auth": { + "strategy": "dummy" + }, "ReviewsService": { - "kind": "odata", "model": "@capire/reviews" + "kind": "odata", + "model": "@capire/reviews" }, "OrdersService": { - "kind": "odata", "model": "@capire/orders" + "kind": "odata", + "model": "@capire/orders" }, "db": { "kind": "sql",