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/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
- let columnsMap = span.columns;
53
+ const columnsMap = span.columns;
24
54
  const columns = span.table._columns.filter(column => !columnsMap || columnsMap.get(column));
25
- const protoRow = createProto(columns, span);
55
+ const ProtoRow = createProto(columns, span);
26
56
  const manyNames = [];
27
57
 
28
- const c = {};
29
- c.visitJoin = () => { };
30
- c.visitOne = () => { };
31
- c.visitMany = function (leg) {
32
- manyNames.push(leg.name);
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(onEachLeg);
36
- return createRow;
66
+ span.legs.forEach(leg => leg.accept(c));
37
67
 
38
- function onEachLeg(leg) {
39
- leg.accept(c);
40
- }
68
+ return createRow;
41
69
 
42
70
  function createRow() {
43
- const obj = Object.create(protoRow);
44
- for (let i = 0; i < manyNames.length; i++) {
45
- obj[manyNames[i]] = [];
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
- let obj = {};
53
- for (let i = 0; i < columns.length; i++) {
54
- obj[columns[i].alias] = null;
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
- c.visitJoin = function (leg) {
62
- obj[leg.name] = null;
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
- span.legs.forEach(onEachLeg);
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
- function onEachLeg(leg) {
72
- leg.accept(c);
101
+ span.legs.forEach(leg => leg.accept(c));
73
102
  }
74
103
 
75
- return obj;
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 < primaryColumnsLength; j++) {
118
- if (row[keys[j]] === null)
119
- pkWithNullCount++;
120
- if (pkWithNullCount === primaryColumnsLength) {
121
- outRow = null;
122
- break;
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
- if (shouldCreateMap && outRow) {
164
+ outRows[i] = outRow;
165
+ if (parentRows)
166
+ parentRows[i][parentProp] = outRow;
167
+ if (shouldCreateMap) {
130
168
  fkIds[i] = getIds(outRow);
131
- addToMap(rowsMap, primaryColumns, outRow);
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
- //alt 1
165
- // 3.1 sec
166
- // await new Promise((resolve, reject) => {
167
- // setTimeout(() => {
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, rawRows, resultRows, keys) {
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 (leg) {
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 = leg.columns.map(column => subRows[i][column.alias]);
367
- const parentRow = getFromMap(rowsMap, table._primaryColumns, key);
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
- span.legs.forEach(onEachLeg);
375
-
376
- function onEachLeg(leg) {
377
- leg.accept(c);
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
- // await Promise.all(promises);
381
- // }
382
-
383
- // async function decodeRelations2(strategy, span, rawRows, resultRows, keys) {
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 previous
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 (leg) {
264
+ c.visitJoin = function(leg) {
508
265
  const name = leg.name;
509
- const p = decode(strategy[name], leg.span, rawRows, keys).then((rows) => {
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 = function (leg) {
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, primaryColumns, row) {
571
-
572
- const lastIndex = primaryColumns.length - 1;
573
- for (let i = 0; i < lastIndex; i++) {
574
- const id = row[primaryColumns[i].alias];
575
- if (map.has(id))
576
- map = map.get(id);
577
- else {
578
- const next = new Map();
579
- map.set(id, next);
580
- map = next;
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
- map.set(row[primaryColumns[lastIndex].alias], row);
325
+ else
326
+ map.set(values, row);
584
327
  }
585
328
 
586
329
  function getFromMap(map, primaryColumns, values) {
587
- const length = primaryColumns.length;
588
- for (let i = 0; i < length; i++) {
589
- map = map.get(values[i]);
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
- return map;
337
+ else
338
+ return map.get(values);
592
339
  }
593
340
 
594
341