orange-orm 4.3.0-beta.3 → 4.4.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/getManyDto4.js +313 -0
- package/getManyDtoFast.js +530 -0
- package/package.json +4 -4
- package/src/getManyDto.js +140 -393
- package/src/getManyDtoFast2.js +293 -0
- package/src/getManyDtoFastes.js +588 -0
- package/src/table/column/binary/newEncode.js +7 -0
- package/src/table/column/boolean/newEncode.js +12 -0
- package/src/table/column/date/newEncode.js +13 -2
- package/src/table/column/dateWithTimeZone/newEncode.js +10 -0
- package/src/table/column/guid/newEncode.js +10 -0
- package/src/table/column/in.js +11 -14
- package/src/table/column/json/newEncode.js +15 -0
- package/src/table/column/numeric/newEncode.js +10 -0
- package/src/table/column/string/newEncode.js +10 -1
- package/src/table/getManyDtoFast3.js +313 -0
package/src/getManyDto.js
CHANGED
|
@@ -19,68 +19,98 @@ async function getManyDto(table, filter, strategy, spanFromParent) {
|
|
|
19
19
|
return decode(strategy, span, await res[0]);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
// function newCreateRow(span) {
|
|
23
|
+
// let columnsMap = span.columns;
|
|
24
|
+
// const columns = span.table._columns.filter(column => !columnsMap || columnsMap.get(column));
|
|
25
|
+
// const protoRow = createProto(columns, span);
|
|
26
|
+
// const manyNames = [];
|
|
27
|
+
|
|
28
|
+
// const c = {};
|
|
29
|
+
// c.visitJoin = () => { };
|
|
30
|
+
// c.visitOne = () => { };
|
|
31
|
+
// c.visitMany = function(leg) {
|
|
32
|
+
// manyNames.push(leg.name);
|
|
33
|
+
// };
|
|
34
|
+
|
|
35
|
+
// span.legs.forEach(onEachLeg);
|
|
36
|
+
// return createRow;
|
|
37
|
+
|
|
38
|
+
// function onEachLeg(leg) {
|
|
39
|
+
// leg.accept(c);
|
|
40
|
+
// }
|
|
41
|
+
|
|
42
|
+
// function createRow() {
|
|
43
|
+
// const obj = Object.create(protoRow);
|
|
44
|
+
// for (let i = 0; i < manyNames.length; i++) {
|
|
45
|
+
// obj[manyNames[i]] = [];
|
|
46
|
+
// }
|
|
47
|
+
// return obj;
|
|
48
|
+
// }
|
|
49
|
+
// }
|
|
50
|
+
|
|
51
|
+
|
|
22
52
|
function newCreateRow(span) {
|
|
23
|
-
|
|
53
|
+
const columnsMap = span.columns;
|
|
24
54
|
const columns = span.table._columns.filter(column => !columnsMap || columnsMap.get(column));
|
|
25
|
-
const
|
|
55
|
+
const ProtoRow = createProto(columns, span);
|
|
26
56
|
const manyNames = [];
|
|
27
57
|
|
|
28
|
-
const c = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
58
|
+
const c = {
|
|
59
|
+
visitJoin: () => { },
|
|
60
|
+
visitOne: () => { },
|
|
61
|
+
visitMany: function(leg) {
|
|
62
|
+
manyNames.push(leg.name);
|
|
63
|
+
}
|
|
33
64
|
};
|
|
34
65
|
|
|
35
|
-
span.legs.forEach(
|
|
36
|
-
return createRow;
|
|
66
|
+
span.legs.forEach(leg => leg.accept(c));
|
|
37
67
|
|
|
38
|
-
|
|
39
|
-
leg.accept(c);
|
|
40
|
-
}
|
|
68
|
+
return createRow;
|
|
41
69
|
|
|
42
70
|
function createRow() {
|
|
43
|
-
const obj =
|
|
44
|
-
|
|
45
|
-
obj[
|
|
46
|
-
}
|
|
71
|
+
const obj = new ProtoRow();
|
|
72
|
+
manyNames.forEach(name => {
|
|
73
|
+
obj[name] = [];
|
|
74
|
+
});
|
|
47
75
|
return obj;
|
|
48
76
|
}
|
|
49
77
|
}
|
|
50
78
|
|
|
51
79
|
function createProto(columns, span) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
for (let key in span.aggregates) {
|
|
57
|
-
obj[key] = null;
|
|
58
|
-
}
|
|
59
|
-
const c = {};
|
|
80
|
+
function ProtoRow() {
|
|
81
|
+
columns.forEach(column => {
|
|
82
|
+
this[column.alias] = null;
|
|
83
|
+
});
|
|
60
84
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
c.visitOne = c.visitJoin;
|
|
65
|
-
c.visitMany = function (leg) {
|
|
66
|
-
obj[leg.name] = null;
|
|
67
|
-
};
|
|
85
|
+
for (const key in span.aggregates) {
|
|
86
|
+
this[key] = null;
|
|
87
|
+
}
|
|
68
88
|
|
|
69
|
-
|
|
89
|
+
const c = {
|
|
90
|
+
visitJoin: (leg) => {
|
|
91
|
+
this[leg.name] = null;
|
|
92
|
+
},
|
|
93
|
+
visitOne: (leg) => {
|
|
94
|
+
this[leg.name] = null;
|
|
95
|
+
},
|
|
96
|
+
visitMany: (leg) => {
|
|
97
|
+
this[leg.name] = null;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
70
100
|
|
|
71
|
-
|
|
72
|
-
leg.accept(c);
|
|
101
|
+
span.legs.forEach(leg => leg.accept(c));
|
|
73
102
|
}
|
|
74
103
|
|
|
75
|
-
return
|
|
104
|
+
return ProtoRow;
|
|
76
105
|
}
|
|
77
106
|
|
|
107
|
+
|
|
78
108
|
function hasManyRelations(span) {
|
|
79
109
|
let result;
|
|
80
110
|
const c = {};
|
|
81
111
|
c.visitJoin = () => { };
|
|
82
112
|
c.visitOne = c.visitJoin;
|
|
83
|
-
c.visitMany = function
|
|
113
|
+
c.visitMany = function() {
|
|
84
114
|
result = true;
|
|
85
115
|
};
|
|
86
116
|
|
|
@@ -92,7 +122,7 @@ function hasManyRelations(span) {
|
|
|
92
122
|
}
|
|
93
123
|
}
|
|
94
124
|
|
|
95
|
-
async function decode(strategy, span, rows, keys = rows.length > 0 ? Object.keys(rows[0]) : []) {
|
|
125
|
+
async function decode(strategy, span, rows, keys = rows.length > 0 ? Object.keys(rows[0]) : [], parentRows, parentProp) {
|
|
96
126
|
const table = span.table;
|
|
97
127
|
let columnsMap = span.columns;
|
|
98
128
|
const columns = table._columns.filter(column => !columnsMap || columnsMap.get(column));
|
|
@@ -108,52 +138,37 @@ async function decode(strategy, span, rows, keys = rows.length > 0 ? Object.keys
|
|
|
108
138
|
const outRows = new Array(rowsLength);
|
|
109
139
|
const createRow = newCreateRow(span);
|
|
110
140
|
const shouldCreateMap = hasManyRelations(span);
|
|
111
|
-
let all = [];;
|
|
112
|
-
|
|
113
141
|
for (let i = 0; i < rowsLength; i++) {
|
|
114
142
|
const row = rows[i];
|
|
115
143
|
let outRow = createRow();
|
|
116
144
|
let pkWithNullCount = 0;
|
|
117
|
-
for (let j = 0; j <
|
|
118
|
-
if (
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
145
|
+
for (let j = 0; j < columnsLength; j++) {
|
|
146
|
+
if (j < primaryColumnsLength) {
|
|
147
|
+
if (row[keys[j]] === null)
|
|
148
|
+
pkWithNullCount++;
|
|
149
|
+
if (pkWithNullCount === primaryColumnsLength) {
|
|
150
|
+
outRow = null;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
123
153
|
}
|
|
124
154
|
const column = columns[j];
|
|
125
155
|
outRow[column.alias] = column.decode(row[keys[j]]);
|
|
156
|
+
}
|
|
126
157
|
|
|
158
|
+
for (let j = 0; j < aggregateKeys.length; j++) {
|
|
159
|
+
const key = aggregateKeys[j];
|
|
160
|
+
const parse = span.aggregates[key].column?.decode || Number.parseFloat;
|
|
161
|
+
outRow[key] = parse(row[keys[j + columnsLength]]);
|
|
127
162
|
}
|
|
128
163
|
|
|
129
|
-
|
|
164
|
+
outRows[i] = outRow;
|
|
165
|
+
if (parentRows)
|
|
166
|
+
parentRows[i][parentProp] = outRow;
|
|
167
|
+
if (shouldCreateMap) {
|
|
130
168
|
fkIds[i] = getIds(outRow);
|
|
131
|
-
addToMap(rowsMap,
|
|
169
|
+
addToMap(rowsMap, fkIds[i], outRow);
|
|
132
170
|
}
|
|
133
|
-
outRows[i] = outRow;
|
|
134
171
|
}
|
|
135
|
-
|
|
136
|
-
all.push(new Promise((resolve) => {
|
|
137
|
-
setImmediate(async () => {
|
|
138
|
-
for (let i = 0; i < rowsLength; i++) {
|
|
139
|
-
const currentOutRow = outRows[i];
|
|
140
|
-
const currentRow = rows[i];
|
|
141
|
-
for (let j = primaryColumnsLength; j < columnsLength; j++) {
|
|
142
|
-
const column = columns[j];
|
|
143
|
-
currentOutRow[column.alias] = column.decode(currentRow[keys[j]]);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
for (let j = 0; j < aggregateKeys.length; j++) {
|
|
147
|
-
const key = aggregateKeys[j];
|
|
148
|
-
const parse = span.aggregates[key].column?.decode || Number.parseFloat;
|
|
149
|
-
currentOutRow[key] = parse(currentRow[keys[j + columnsLength]]);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
resolve();
|
|
153
|
-
});
|
|
154
|
-
}));
|
|
155
|
-
|
|
156
|
-
|
|
157
172
|
span._rowsMap = rowsMap;
|
|
158
173
|
span._ids = fkIds;
|
|
159
174
|
|
|
@@ -161,107 +176,15 @@ async function decode(strategy, span, rows, keys = rows.length > 0 ? Object.keys
|
|
|
161
176
|
if (span.legs.toArray().length === 0)
|
|
162
177
|
return outRows;
|
|
163
178
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
// if (shouldCreateMap)
|
|
169
|
-
// decodeManyRelations(strategy, span, rows, outRows, keys)
|
|
170
|
-
// .then(() => decodeRelations2(strategy, span, rows, outRows, keys))
|
|
171
|
-
// .then(resolve)
|
|
172
|
-
// .catch(reject);
|
|
173
|
-
// else
|
|
174
|
-
// decodeRelations2(strategy, span, rows, outRows, keys)
|
|
175
|
-
// .then(resolve)
|
|
176
|
-
// .catch(reject);
|
|
177
|
-
// }, 0);
|
|
178
|
-
// });
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
//alt 1
|
|
182
|
-
// 3.2 sec
|
|
183
|
-
// await new Promise((resolve, reject) => {
|
|
184
|
-
// setTimeout(() => {
|
|
185
|
-
// const all = [];
|
|
186
|
-
// if (shouldCreateMap)
|
|
187
|
-
// all.push(decodeManyRelations(strategy, span, rows, outRows, keys))
|
|
188
|
-
|
|
189
|
-
// all.push(new Promise((resolve, reject) => {
|
|
190
|
-
// setTimeout(async () => {
|
|
191
|
-
// await decodeRelations2(strategy, span, rows, outRows, keys);
|
|
192
|
-
// resolve();
|
|
193
|
-
|
|
194
|
-
// }, 0);
|
|
195
|
-
// }));
|
|
196
|
-
// // const p2 = decodeRelations2(strategy, span, rows, outRows, keys);
|
|
197
|
-
// Promise.all(all).then(resolve, reject);
|
|
198
|
-
// }, 0);
|
|
199
|
-
// });
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
// let all = [];;
|
|
203
|
-
// if(shouldCreateMap) {
|
|
204
|
-
|
|
205
|
-
// await decodeManyRelations(strategy, span, rows, outRows, keys).then(() => decodeRelations2(strategy, span, rows, outRows, keys));
|
|
206
|
-
// }
|
|
207
|
-
// else
|
|
208
|
-
// await decodeRelations2(strategy, span, rows, outRows, keys);
|
|
209
|
-
|
|
210
|
-
// await Promise.all(all);
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
//alt 3
|
|
215
|
-
// 3.05 sec
|
|
216
|
-
|
|
217
|
-
if (shouldCreateMap) {
|
|
218
|
-
// all.push( decodeRelations2(strategy, span, rows, outRows, keys).then(() => decodeManyRelations(strategy, span)));
|
|
219
|
-
all.push(decodeManyRelations(strategy, span));
|
|
220
|
-
all.push(decodeRelations2(strategy, span, rows, outRows, keys));
|
|
221
|
-
// all.push( decodeManyRelations(strategy, span).then(() => decodeRelations2(strategy, span, rows, outRows, keys)));
|
|
222
|
-
// all.push( decodeManyRelations(strategy, span));
|
|
223
|
-
// all.push(decodeRelations2(strategy, span, rows, outRows, keys));
|
|
224
|
-
// all.push( decodeRelations2(strategy, span, rows, outRows, keys) );
|
|
225
|
-
}
|
|
179
|
+
const all = [];
|
|
180
|
+
|
|
181
|
+
if (shouldCreateMap)
|
|
182
|
+
all.push(decodeManyRelations(strategy, span).then(() => decodeRelations2(strategy, span, rows, outRows, keys)));
|
|
226
183
|
else
|
|
227
184
|
all.push(decodeRelations2(strategy, span, rows, outRows, keys));
|
|
228
185
|
|
|
229
|
-
|
|
230
186
|
await Promise.all(all);
|
|
231
187
|
|
|
232
|
-
//alt 4
|
|
233
|
-
// 3.02 sec
|
|
234
|
-
// const all = [];
|
|
235
|
-
// if (shouldCreateMap)
|
|
236
|
-
// // all.push(new Promise((resolve, reject) => {
|
|
237
|
-
// // setTimeout(async () => {
|
|
238
|
-
// // await decodeManyRelations(strategy, span);
|
|
239
|
-
// // resolve();
|
|
240
|
-
|
|
241
|
-
// // }, 0)
|
|
242
|
-
// // }));
|
|
243
|
-
// all.push(decodeManyRelations(strategy, span));
|
|
244
|
-
// all.push(new Promise((resolve, reject) => {
|
|
245
|
-
// setTimeout(async () => {
|
|
246
|
-
// await decodeRelations2(strategy, span, rows, outRows, keys);
|
|
247
|
-
// resolve();
|
|
248
|
-
|
|
249
|
-
// }, 0);
|
|
250
|
-
// }));
|
|
251
|
-
// await Promise.all(all);
|
|
252
|
-
|
|
253
|
-
// all.push(decodeRelations2(strategy, span, rows, outRows, keys));
|
|
254
|
-
|
|
255
|
-
//alt 4
|
|
256
|
-
// 3.3 sec
|
|
257
|
-
// if(shouldCreateMap)
|
|
258
|
-
// await decodeRelations(strategy, span, rows, outRows, keys);
|
|
259
|
-
// else
|
|
260
|
-
// await decodeRelations2(strategy, span, rows, outRows, keys);
|
|
261
|
-
|
|
262
|
-
// await decodeRelationsNext(strategy, span, rows, outRows, keys);
|
|
263
|
-
// await decodeRelations(strategy, span, rows, outRows, keys);
|
|
264
|
-
|
|
265
188
|
return outRows;
|
|
266
189
|
|
|
267
190
|
|
|
@@ -283,254 +206,70 @@ async function decode(strategy, span, rows, keys = rows.length > 0 ? Object.keys
|
|
|
283
206
|
}
|
|
284
207
|
|
|
285
208
|
}
|
|
286
|
-
async function decodeRelations2(strategy, span, rawRows, resultRows, keys) {
|
|
287
|
-
const legs = span.legs.toArray();
|
|
288
|
-
if (legs.length === 0)
|
|
289
|
-
return;
|
|
290
|
-
const promises = [];
|
|
291
|
-
const c = {};
|
|
292
|
-
c.visitJoin = function (leg) {
|
|
293
|
-
const name = leg.name;
|
|
294
|
-
const p = decode(strategy[name], leg.span, rawRows, keys).then((rows) => {
|
|
295
|
-
for (let i = 0; i < rows.length; i++) {
|
|
296
|
-
resultRows[i][name] = rows[i];
|
|
297
|
-
}
|
|
298
|
-
});
|
|
299
|
-
promises.push(p);
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
c.visitOne = c.visitJoin;
|
|
303
|
-
|
|
304
|
-
c.visitMany = () => { };
|
|
305
|
-
|
|
306
|
-
function processLegs(index) {
|
|
307
|
-
if (index >= legs.length) {
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
const leg = legs[index];
|
|
311
|
-
leg.accept(c);
|
|
312
|
-
Promise.all(promises).then(() => {
|
|
313
|
-
setImmediate(() => {
|
|
314
|
-
processLegs(index + 1);
|
|
315
|
-
});
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
processLegs(0);
|
|
320
|
-
|
|
321
|
-
await Promise.all(promises);
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
async function decodeRelations3(strategy, span, rawRows, resultRows, keys) {
|
|
325
|
-
const promises = [];
|
|
326
|
-
const c = {};
|
|
327
|
-
c.visitJoin = function (leg) {
|
|
328
|
-
const name = leg.name;
|
|
329
|
-
const p = decode(strategy[name], leg.span, rawRows, keys).then((rows) => {
|
|
330
|
-
for (let i = 0; i < rows.length; i++) {
|
|
331
|
-
resultRows[i][name] = rows[i];
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
promises.push(p);
|
|
335
|
-
};
|
|
336
|
-
|
|
337
|
-
c.visitOne = c.visitJoin;
|
|
338
|
-
|
|
339
|
-
c.visitMany = () => { };
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
span.legs.forEach(onEachLeg);
|
|
343
|
-
|
|
344
|
-
function onEachLeg(leg) {
|
|
345
|
-
leg.accept(c);
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
await Promise.all(promises);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
209
|
|
|
352
|
-
async function decodeManyRelations(strategy, span
|
|
210
|
+
async function decodeManyRelations(strategy, span) {
|
|
353
211
|
const promises = [];
|
|
354
212
|
const c = {};
|
|
355
213
|
c.visitJoin = () => { };
|
|
356
214
|
c.visitOne = c.visitJoin;
|
|
357
215
|
|
|
358
|
-
c.visitMany = function
|
|
216
|
+
c.visitMany = function(leg) {
|
|
359
217
|
const name = leg.name;
|
|
360
218
|
const table = span.table;
|
|
361
219
|
const relation = table._relations[name];
|
|
362
|
-
const filter = createOneFilter(relation, span._ids);
|
|
363
220
|
const rowsMap = span._rowsMap;
|
|
221
|
+
|
|
222
|
+
const filter = createOneFilter(relation, span._ids);
|
|
223
|
+
const extractKey = createExtractKey(leg);
|
|
224
|
+
const extractFromMap = createExtractFromMap(rowsMap, table._primaryColumns);
|
|
364
225
|
const p = getManyDto(relation.childTable, filter, strategy[name], leg.span).then(subRows => {
|
|
365
226
|
for (let i = 0; i < subRows.length; i++) {
|
|
366
|
-
const key =
|
|
367
|
-
const parentRow =
|
|
227
|
+
const key = extractKey(subRows[i]);
|
|
228
|
+
const parentRow = extractFromMap(key);
|
|
368
229
|
parentRow[name].push(subRows[i]);
|
|
369
230
|
}
|
|
370
231
|
});
|
|
371
232
|
promises.push(p);
|
|
372
233
|
};
|
|
373
234
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
235
|
+
function createExtractKey(leg) {
|
|
236
|
+
if (leg.columns.length === 1) {
|
|
237
|
+
const alias = leg.columns[0].alias;
|
|
238
|
+
return (row) => row[alias];
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
const aliases = leg.columns.map(column => column.alias);
|
|
242
|
+
return (row) => aliases.map(alias => row[alias]);
|
|
243
|
+
}
|
|
378
244
|
}
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
// const promises = [];
|
|
385
|
-
// const c = {};
|
|
386
|
-
// c.visitJoin = function (leg) {
|
|
387
|
-
// const name = leg.name;
|
|
388
|
-
// //todo avoid traverse twice noMany relations below
|
|
389
|
-
// const p = decode(strategy[name], leg.span, rawRows, keys).then((rows) => {
|
|
390
|
-
// for (let i = 0; i < rows.length; i++) {
|
|
391
|
-
// resultRows[i][name] = rows[i];
|
|
392
|
-
// }
|
|
393
|
-
// });
|
|
394
|
-
// promises.push(p);
|
|
395
|
-
// };
|
|
396
|
-
|
|
397
|
-
// c.visitOne = c.visitJoin;
|
|
398
|
-
|
|
399
|
-
// c.visitMany = () => { };
|
|
400
|
-
|
|
401
|
-
// span.legs.forEach(onEachLeg);
|
|
402
|
-
|
|
403
|
-
// function onEachLeg(leg) {
|
|
404
|
-
// leg.accept(c);
|
|
405
|
-
// }
|
|
406
|
-
|
|
407
|
-
await Promise.all(promises);
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
async function decodeRelations3(strategy, span, rawRows, resultRows, keys) {
|
|
411
|
-
|
|
412
|
-
let previous = new Promise((resolve) => setImmediate(() => resolve()));
|
|
413
|
-
const c = {};
|
|
414
|
-
|
|
415
|
-
c.visitJoin = function (leg) {
|
|
416
|
-
const name = leg.name;
|
|
417
|
-
const p = new Promise((resolve) => {
|
|
418
|
-
setImmediate(() => {
|
|
419
|
-
decode(strategy[name], leg.span, rawRows, keys).then((rows) => {
|
|
420
|
-
for (let i = 0; i < rows.length; i++) {
|
|
421
|
-
resultRows[i][name] = rows[i];
|
|
422
|
-
}
|
|
423
|
-
resolve();
|
|
424
|
-
});
|
|
425
|
-
});
|
|
426
|
-
});
|
|
427
|
-
previous = previous.then(() => p);
|
|
428
|
-
};
|
|
429
|
-
|
|
430
|
-
c.visitOne = c.visitJoin;
|
|
431
|
-
|
|
432
|
-
c.visitMany = () => { };
|
|
433
|
-
|
|
434
|
-
span.legs.forEach(onEachLeg);
|
|
435
|
-
|
|
436
|
-
function onEachLeg(leg) {
|
|
437
|
-
leg.accept(c);
|
|
245
|
+
function createExtractFromMap(map, primaryColumns) {
|
|
246
|
+
if (primaryColumns.length === 1)
|
|
247
|
+
return (key) => map.get(key);
|
|
248
|
+
else
|
|
249
|
+
return getFromMap.bind(null, map, primaryColumns);
|
|
438
250
|
}
|
|
439
251
|
|
|
440
|
-
await previous;
|
|
441
|
-
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
async function decodeRelationsNext(strategy, span, rawRows, resultRows, keys) {
|
|
446
|
-
// const promises = [];
|
|
447
|
-
let previous = new Promise((resolve) => setImmediate(() => resolve()));
|
|
448
|
-
const c = {};
|
|
449
|
-
|
|
450
|
-
c.visitJoin = function (leg) {
|
|
451
|
-
const name = leg.name;
|
|
452
|
-
const p = new Promise((resolve) => {
|
|
453
|
-
setImmediate(() => {
|
|
454
|
-
decode(strategy[name], leg.span, rawRows, keys).then((rows) => {
|
|
455
|
-
for (let i = 0; i < rows.length; i++) {
|
|
456
|
-
resultRows[i][name] = rows[i];
|
|
457
|
-
}
|
|
458
|
-
resolve();
|
|
459
|
-
});
|
|
460
|
-
});
|
|
461
|
-
});
|
|
462
|
-
previous = previous.then(() => p);
|
|
463
|
-
};
|
|
464
|
-
|
|
465
|
-
c.visitOne = c.visitJoin;
|
|
466
|
-
|
|
467
|
-
c.visitMany = function (leg) {
|
|
468
|
-
const p = new Promise((resolve, reject) => {
|
|
469
|
-
setImmediate(() => {
|
|
470
|
-
|
|
471
|
-
const name = leg.name;
|
|
472
|
-
const table = span.table;
|
|
473
|
-
const relation = table._relations[name];
|
|
474
|
-
const filter = createOneFilter(relation, span._ids);
|
|
475
|
-
const rowsMap = span._rowsMap;
|
|
476
|
-
|
|
477
|
-
getManyDto(relation.childTable, filter, strategy[name], leg.span).then(subRows => {
|
|
478
|
-
for (let i = 0; i < subRows.length; i++) {
|
|
479
|
-
const key = leg.columns.map(column => subRows[i][column.alias]);
|
|
480
|
-
const parentRow = getFromMap(rowsMap, table._primaryColumns, key);
|
|
481
|
-
parentRow[name].push(subRows[i]);
|
|
482
|
-
}
|
|
483
|
-
}).then(() => resolve(), reject);
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
});
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
previous = previous.then(() => p);
|
|
491
|
-
// promises.push(p);
|
|
492
|
-
};
|
|
493
|
-
|
|
494
252
|
span.legs.forEach(onEachLeg);
|
|
495
253
|
|
|
496
254
|
function onEachLeg(leg) {
|
|
497
255
|
leg.accept(c);
|
|
498
256
|
}
|
|
499
257
|
|
|
500
|
-
await
|
|
258
|
+
await Promise.all(promises);
|
|
501
259
|
}
|
|
502
260
|
|
|
503
|
-
|
|
504
|
-
async function decodeRelations(strategy, span, rawRows, resultRows, keys) {
|
|
261
|
+
async function decodeRelations2(strategy, span, rawRows, resultRows, keys) {
|
|
505
262
|
const promises = [];
|
|
506
263
|
const c = {};
|
|
507
|
-
c.visitJoin = function
|
|
264
|
+
c.visitJoin = function(leg) {
|
|
508
265
|
const name = leg.name;
|
|
509
|
-
const p = decode(strategy[name], leg.span, rawRows, keys
|
|
510
|
-
for (let i = 0; i < rows.length; i++) {
|
|
511
|
-
resultRows[i][name] = rows[i];
|
|
512
|
-
}
|
|
513
|
-
});
|
|
266
|
+
const p = decode(strategy[name], leg.span, rawRows, keys, resultRows, name);
|
|
514
267
|
promises.push(p);
|
|
515
268
|
};
|
|
516
269
|
|
|
517
270
|
c.visitOne = c.visitJoin;
|
|
518
271
|
|
|
519
|
-
c.visitMany =
|
|
520
|
-
const name = leg.name;
|
|
521
|
-
const table = span.table;
|
|
522
|
-
const relation = table._relations[name];
|
|
523
|
-
const filter = createOneFilter(relation, span._ids);
|
|
524
|
-
const rowsMap = span._rowsMap;
|
|
525
|
-
const p = getManyDto(relation.childTable, filter, strategy[name], leg.span).then(subRows => {
|
|
526
|
-
for (let i = 0; i < subRows.length; i++) {
|
|
527
|
-
const key = leg.columns.map(column => subRows[i][column.alias]);
|
|
528
|
-
const parentRow = getFromMap(rowsMap, table._primaryColumns, key);
|
|
529
|
-
parentRow[name].push(subRows[i]);
|
|
530
|
-
}
|
|
531
|
-
});
|
|
532
|
-
promises.push(p);
|
|
533
|
-
};
|
|
272
|
+
c.visitMany = () => { };
|
|
534
273
|
|
|
535
274
|
|
|
536
275
|
span.legs.forEach(onEachLeg);
|
|
@@ -567,28 +306,36 @@ function createOneFilter(relation, ids) {
|
|
|
567
306
|
}
|
|
568
307
|
}
|
|
569
308
|
|
|
570
|
-
function addToMap(map,
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
309
|
+
function addToMap(map, values, row) {
|
|
310
|
+
if (Array.isArray(values)) {
|
|
311
|
+
|
|
312
|
+
const lastIndex = values.length - 1;
|
|
313
|
+
for (let i = 0; i < lastIndex; i++) {
|
|
314
|
+
const id = values[i];
|
|
315
|
+
if (map.has(id))
|
|
316
|
+
map = map.get(id);
|
|
317
|
+
else {
|
|
318
|
+
const next = new Map();
|
|
319
|
+
map.set(id, next);
|
|
320
|
+
map = next;
|
|
321
|
+
}
|
|
581
322
|
}
|
|
323
|
+
map.set(values[lastIndex], row);
|
|
582
324
|
}
|
|
583
|
-
|
|
325
|
+
else
|
|
326
|
+
map.set(values, row);
|
|
584
327
|
}
|
|
585
328
|
|
|
586
329
|
function getFromMap(map, primaryColumns, values) {
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
330
|
+
if (Array.isArray(values)) {
|
|
331
|
+
const length = primaryColumns.length;
|
|
332
|
+
for (let i = 0; i < length; i++) {
|
|
333
|
+
map = map.get(values[i]);
|
|
334
|
+
}
|
|
335
|
+
return map;
|
|
590
336
|
}
|
|
591
|
-
|
|
337
|
+
else
|
|
338
|
+
return map.get(values);
|
|
592
339
|
}
|
|
593
340
|
|
|
594
341
|
|