1
1
const cds = require ( "@sap/cds" )
2
+ const DataLoader = require ( "dataloader" ) ;
2
3
const LOG = cds . log ( "change-log" )
3
4
4
5
@@ -22,18 +23,28 @@ const getEntityByContextPath = function (aPath, hasComp = false) {
22
23
23
24
const getObjIdElementNamesInArray = function ( elements ) {
24
25
if ( Array . isArray ( elements ) ) return elements . map ( e => {
25
- const splitted = ( e [ "=" ] || e ) . split ( '.' )
26
+ const splitted = ( e [ "=" ] || e ) . split ( '.' )
26
27
splitted . shift ( )
27
28
return splitted . join ( '.' )
28
29
} )
29
30
else return [ ]
30
31
}
31
32
32
- const getCurObjFromDbQuery = async function ( entityName , queryVal , /**optional*/ queryKey = 'ID' ) {
33
+ const getCurObjFromDbQuery = async function ( entityName , queryVal , /**optional*/ queryKey = 'ID' ) {
34
+ if ( ! ( entityName in cds . context . dataloaders ) ) {
35
+ cds . context . dataloaders [ entityName ] = new DataLoader ( async ( keys ) => {
36
+ // REVISIT: This always reads all elements -> should read required ones only!
37
+ const results = await SELECT . from ( entityName ) . where ( queryKey , 'in' , keys )
38
+ const resultsByKey = results . reduce ( ( acc , instance ) => {
39
+ const key = instance [ queryKey ]
40
+ acc [ key ] = instance
41
+ return acc
42
+ } , { } )
43
+ return keys . map ( key => resultsByKey [ key ] || { } )
44
+ } )
45
+ }
33
46
if ( ! queryVal ) return { }
34
- // REVISIT: This always reads all elements -> should read required ones only!
35
- const obj = await SELECT . one . from ( entityName ) . where ( { [ queryKey ] : queryVal } )
36
- return obj || { }
47
+ return cds . context . dataloaders [ entityName ] . load ( queryVal )
37
48
}
38
49
39
50
const getCurObjFromReqData = function ( reqData , nodePathVal , pathVal ) {
@@ -71,21 +82,22 @@ const getCurObjFromReqData = function (reqData, nodePathVal, pathVal) {
71
82
}
72
83
73
84
74
- async function getObjectId ( reqData , entityName , fields , curObj ) {
75
- let all = [ ] , { curObjFromReqData : req_data = { } , curObjFromDbQuery : db_data = { } } = curObj
85
+ async function getObjectId ( reqData , entityName , fields , curObj ) {
86
+ let all = [ ] , { curObjFromReqData : req_data = { } , curObjFromDbQuery : db_data = { } } = curObj
76
87
let entity = cds . model . definitions [ entityName ]
77
88
if ( ! fields ?. length ) fields = entity [ "@changelog" ] ?. map ?. ( k => k [ '=' ] || k ) || [ ]
78
89
for ( let field of fields ) {
79
90
let path = field . split ( '.' )
80
91
if ( path . length > 1 ) {
81
92
let current = entity , _db_data = db_data
82
93
while ( path . length > 1 ) {
83
- let assoc = current . elements [ path [ 0 ] ] ; if ( ! assoc ?. isAssociation ) break
94
+ let assoc = current . elements [ path [ 0 ] ] ;
95
+ if ( ! assoc ?. isAssociation ) break
84
96
let foreignKey = assoc . keys ?. [ 0 ] ?. $generatedFieldName
85
97
let IDval =
86
- req_data [ foreignKey ] && current . name === entityName
87
- ? req_data [ foreignKey ]
88
- : _db_data [ foreignKey ]
98
+ req_data [ foreignKey ] && current . name === entityName
99
+ ? req_data [ foreignKey ]
100
+ : _db_data [ foreignKey ]
89
101
if ( ! IDval ) {
90
102
_db_data = { } ;
91
103
} else try {
@@ -125,19 +137,18 @@ async function getObjectId (reqData, entityName, fields, curObj) {
125
137
}
126
138
127
139
128
-
129
140
const getDBEntity = ( entity ) => {
130
141
if ( typeof entity === 'string' ) entity = cds . model . definitions [ entity ]
131
142
let proto = Reflect . getPrototypeOf ( entity )
132
143
if ( proto instanceof cds . entity ) return proto
133
144
}
134
145
135
146
const getValueEntityType = function ( entityName , fields ) {
136
- const types = [ ] , entity = cds . model . definitions [ entityName ]
147
+ const types = [ ] , entity = cds . model . definitions [ entityName ]
137
148
for ( let field of fields ) {
138
149
let current = entity , path = field . split ( '.' )
139
150
if ( path . length > 1 ) {
140
- for ( ; ; ) {
151
+ for ( ; ; ) {
141
152
let target = current . elements [ path [ 0 ] ] ?. _target
142
153
if ( target ) current = target ; else break
143
154
path . shift ( )
@@ -167,20 +178,20 @@ const hasComposition = function (parentEntity, subEntity) {
167
178
}
168
179
169
180
const _getCompositionObjFromReq = function ( obj , targetID ) {
170
- if ( obj ?. ID === targetID ) {
171
- return obj ;
172
- }
181
+ if ( obj ?. ID === targetID ) {
182
+ return obj ;
183
+ }
173
184
174
- for ( const key in obj ) {
175
- if ( typeof obj [ key ] === "object" && obj [ key ] !== null ) {
176
- const result = _getCompositionObjFromReq ( obj [ key ] , targetID ) ;
177
- if ( result ) {
178
- return result ;
179
- }
180
- }
185
+ for ( const key in obj ) {
186
+ if ( typeof obj [ key ] === "object" && obj [ key ] !== null ) {
187
+ const result = _getCompositionObjFromReq ( obj [ key ] , targetID ) ;
188
+ if ( result ) {
189
+ return result ;
190
+ }
181
191
}
192
+ }
182
193
183
- return null ;
194
+ return null ;
184
195
} ;
185
196
186
197
module . exports = {
0 commit comments