From 4e63d2a4750b38de1b55fdb2ef0db0b023ebffdf Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Wed, 17 Apr 2024 12:25:46 +0200 Subject: [PATCH 1/5] test: calculated elements should not be considered for simple ops it doesnt make sense to `UPDATE`, `DELETE` or to `INSERT` a calculated element, this change shows that it is done anyway --- test/bookshop/db/data/sap.capire.bookshop-Authors.csv | 10 +++++----- test/bookshop/db/schema.cds | 6 ++++++ test/scenarios/bookshop/update.test.js | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/test/bookshop/db/data/sap.capire.bookshop-Authors.csv b/test/bookshop/db/data/sap.capire.bookshop-Authors.csv index f97bfeed4..f07c970e1 100644 --- a/test/bookshop/db/data/sap.capire.bookshop-Authors.csv +++ b/test/bookshop/db/data/sap.capire.bookshop-Authors.csv @@ -1,5 +1,5 @@ -ID;name;dateOfBirth;placeOfBirth;dateOfDeath;placeOfDeath -101;Emily Brontë;1818-07-30;Thornton, Yorkshire;1848-12-19;Haworth, Yorkshire -107;Charlotte Brontë;1818-04-21;Thornton, Yorkshire;1855-03-31;Haworth, Yorkshire -150;Edgar Allen Poe;1809-01-19;Boston, Massachusetts;1849-10-07;Baltimore, Maryland -170;Richard Carpenter;1929-08-14;King’s Lynn, Norfolk;2012-02-26;Hertfordshire, England \ No newline at end of file +ID;name;dateOfBirth;placeOfBirth;dateOfDeath;placeOfDeath; city; street; +101;Emily Brontë;1818-07-30;Thornton, Yorkshire;1848-12-19;Haworth, Yorkshire; Bradford; 1 Main Street +107;Charlotte Brontë;1818-04-21;Thornton, Yorkshire;1855-03-31;Haworth, Yorkshire; Bradford; 2 Main Street +150;Edgar Allen Poe;1809-01-19;Boston, Massachusetts;1849-10-07;Baltimore, Maryland; Baltimore; 1 Main Street +170;Richard Carpenter;1929-08-14;King’s Lynn, Norfolk;2012-02-26;Hertfordshire, England; London; 1 Main Street \ No newline at end of file diff --git a/test/bookshop/db/schema.cds b/test/bookshop/db/schema.cds index f2871438e..b5f3cb7fd 100644 --- a/test/bookshop/db/schema.cds +++ b/test/bookshop/db/schema.cds @@ -12,6 +12,8 @@ entity Books : managed { currency : Currency; image : LargeBinary @Core.MediaType : 'image/png'; footnotes: array of String; + + authorsAddress: String = author.address; } entity Authors : managed { @@ -22,6 +24,10 @@ entity Authors : managed { placeOfBirth : String; placeOfDeath : String; books : Association to many Books on books.author = $self; + + street: String; + city: String; + address: String = street || ', ' || city; } /** Hierarchically organized Code List for Genres */ diff --git a/test/scenarios/bookshop/update.test.js b/test/scenarios/bookshop/update.test.js index 0eb66d705..ac0b05a32 100644 --- a/test/scenarios/bookshop/update.test.js +++ b/test/scenarios/bookshop/update.test.js @@ -10,7 +10,7 @@ const admin = { describe('Bookshop - Update', () => { const { expect, PUT } = cds.test(bookshop) - test('Update Book', async () => { + test.only('Update Book', async () => { const res = await PUT( '/admin/Books(201)', // was Books(2) -> UPSERT { From 588291ced9d416fadb6beab2756de3ac766b318d Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Wed, 17 Apr 2024 15:05:53 +0200 Subject: [PATCH 2/5] extend column persistence check --- db-service/lib/cqn2sql.js | 4 +++- test/scenarios/bookshop/update.test.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/db-service/lib/cqn2sql.js b/db-service/lib/cqn2sql.js index ba6ca43c1..c3e7ab172 100644 --- a/db-service/lib/cqn2sql.js +++ b/db-service/lib/cqn2sql.js @@ -749,7 +749,9 @@ class CQN2SQLRenderer { if (_with) _add(_with, x => this.expr(x)) function _add(data, sql4) { for (let c in data) { - if (!elements || (c in elements && !elements[c].virtual)) { + const columnExistsInDatabase = + c in elements && !elements[c].virtual && !elements[c].isAssociation && !elements[c].value + if (!elements || columnExistsInDatabase) { if (cds.unfold && elements?.[c].is_struct) continue // skip structs from universal csn columns.push({ name: c, sql: sql4(data[c]) }) } diff --git a/test/scenarios/bookshop/update.test.js b/test/scenarios/bookshop/update.test.js index ac0b05a32..0eb66d705 100644 --- a/test/scenarios/bookshop/update.test.js +++ b/test/scenarios/bookshop/update.test.js @@ -10,7 +10,7 @@ const admin = { describe('Bookshop - Update', () => { const { expect, PUT } = cds.test(bookshop) - test.only('Update Book', async () => { + test('Update Book', async () => { const res = await PUT( '/admin/Books(201)', // was Books(2) -> UPSERT { From 675d5b3fba823d2e75c2dc63dad37a41f52fcc78 Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Wed, 17 Apr 2024 15:35:27 +0200 Subject: [PATCH 3/5] get condition right --- db-service/lib/cqn2sql.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/db-service/lib/cqn2sql.js b/db-service/lib/cqn2sql.js index c3e7ab172..b6d4119d3 100644 --- a/db-service/lib/cqn2sql.js +++ b/db-service/lib/cqn2sql.js @@ -750,9 +750,8 @@ class CQN2SQLRenderer { function _add(data, sql4) { for (let c in data) { const columnExistsInDatabase = - c in elements && !elements[c].virtual && !elements[c].isAssociation && !elements[c].value - if (!elements || columnExistsInDatabase) { - if (cds.unfold && elements?.[c].is_struct) continue // skip structs from universal csn + elements && c in elements && !elements[c].virtual && !elements[c].isAssociation && !elements[c].value + if (!columnExistsInDatabase) { columns.push({ name: c, sql: sql4(data[c]) }) } } From 0fd715572efae58c3b81e440708fa46f8e44e08a Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Thu, 18 Apr 2024 10:16:47 +0200 Subject: [PATCH 4/5] no negation --- db-service/lib/cqn2sql.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db-service/lib/cqn2sql.js b/db-service/lib/cqn2sql.js index b6d4119d3..3e19b7d40 100644 --- a/db-service/lib/cqn2sql.js +++ b/db-service/lib/cqn2sql.js @@ -751,7 +751,7 @@ class CQN2SQLRenderer { for (let c in data) { const columnExistsInDatabase = elements && c in elements && !elements[c].virtual && !elements[c].isAssociation && !elements[c].value - if (!columnExistsInDatabase) { + if (columnExistsInDatabase) { columns.push({ name: c, sql: sql4(data[c]) }) } } From dbad0ab0a6d35ffe28990a66ab11da0383d3abe3 Mon Sep 17 00:00:00 2001 From: Patrice Bender Date: Thu, 18 Apr 2024 10:24:21 +0200 Subject: [PATCH 5/5] assume column exists for enity wo model --- db-service/lib/cqn2sql.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db-service/lib/cqn2sql.js b/db-service/lib/cqn2sql.js index 3e19b7d40..37472c8b7 100644 --- a/db-service/lib/cqn2sql.js +++ b/db-service/lib/cqn2sql.js @@ -751,7 +751,7 @@ class CQN2SQLRenderer { for (let c in data) { const columnExistsInDatabase = elements && c in elements && !elements[c].virtual && !elements[c].isAssociation && !elements[c].value - if (columnExistsInDatabase) { + if (!elements || columnExistsInDatabase) { columns.push({ name: c, sql: sql4(data[c]) }) } }