diff --git a/db-service/lib/cqn4sql.js b/db-service/lib/cqn4sql.js index 167fd884e..1a845ad5a 100644 --- a/db-service/lib/cqn4sql.js +++ b/db-service/lib/cqn4sql.js @@ -313,7 +313,11 @@ function cqn4sql(originalQuery, model) { lhs = joinForBranch(lhs, c) }) } - return lhs.args.length > 1 ? lhs : lhs.args[0] + const res = lhs.args.length > 1 ? lhs : lhs.args[0] + // default is to-one + if(nextAssoc && nextAssoc.$refLink.definition) + Object.defineProperty(res, 'element', { value: nextAssoc.$refLink.definition, /* why do we need this */writable: true }) + return res } } diff --git a/db-service/test/cqn4sql/assocs2joins.test.js b/db-service/test/cqn4sql/assocs2joins.test.js index 6037f0420..84bb387d1 100644 --- a/db-service/test/cqn4sql/assocs2joins.test.js +++ b/db-service/test/cqn4sql/assocs2joins.test.js @@ -22,6 +22,15 @@ describe('Unfolding Association Path Expressions to Joins', () => { ` expect(query).to.deep.equal(expected) }) + it('in select, one assoc to many', () => { + let query = cqn4sql(CQL`SELECT from bookshop.Authors { ID, name } where books.title LIKE '%Potter%'`, model) + const expected = CQL`SELECT from bookshop.Authors as Authors + left outer join bookshop.Books as books on books.author_ID = Authors.ID + { Authors.ID, Authors.name } + where books.title LIKE '%Potter%' + ` + expect(query).to.deep.equal(expected) + }) it('in select, one deep assoc, with filter', () => { let query = cqn4sql(CQL`SELECT from bookshop.Books { ID, dedication.addressee[name = 'Hasso'].name }`, model) diff --git a/hana/lib/HANAService.js b/hana/lib/HANAService.js index d9c57a949..40d222f37 100644 --- a/hana/lib/HANAService.js +++ b/hana/lib/HANAService.js @@ -686,6 +686,17 @@ class HANAService extends SQLService { return sql } + from(from, q) { + const { element, ref, SELECT } = from + if (!element?.cardinality || ref || SELECT) return super.from(from, q) + const { type, cardinality: { min, max } } = element + const cardinality = + (type === 'cds.Composition' ? 'EXACT ONE' : 'MANY') + + ' TO ' + + (max == 1 ? min == 1 ? 'EXACT ONE' : 'ONE' : 'MANY') + if (from.join) return `${this.from(from.args[0])} ${from.join} ${cardinality} JOIN ${this.from(from.args[1])}${from.on ? ` ON ${this.where(from.on)}` : ''}` + } + from_dummy() { return ' FROM DUMMY' }