@resolveio/server-lib 4.5.13 → 4.6.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/methods/report-builder.js +83 -34
- package/package.json +1 -1
|
@@ -233,6 +233,8 @@ function loadReportBuilderMethods(methodManager) {
|
|
|
233
233
|
$match: initialQueryMatchCondition
|
|
234
234
|
});
|
|
235
235
|
}
|
|
236
|
+
// Add count
|
|
237
|
+
query.push({ $addFields: { count: { $sum: 1 } } });
|
|
236
238
|
sizes = [];
|
|
237
239
|
// Groups - Lookups / Sizes / Unwinds
|
|
238
240
|
groupsRow.forEach(function (row) {
|
|
@@ -266,56 +268,103 @@ function loadReportBuilderMethods(methodManager) {
|
|
|
266
268
|
var _a, _b;
|
|
267
269
|
if (field.fieldPath.includes('$')) {
|
|
268
270
|
var fieldData = field.fieldPath.split('.$');
|
|
269
|
-
var
|
|
271
|
+
var fieldPath_1 = '';
|
|
270
272
|
for (var i = 0; i < fieldData.length - 1; i++) {
|
|
271
|
-
|
|
272
|
-
if (
|
|
273
|
-
query.
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
273
|
+
fieldPath_1 += fieldData[i];
|
|
274
|
+
if (fieldPath_1.split('.$')[fieldPath_1.split('.$').length - 1].includes('(Lookup)')) {
|
|
275
|
+
if (!query.some(function (a) { return a.$lookup && a.$lookup.as === field.lookup_as.replace(/\.\$/g, ''); })) {
|
|
276
|
+
query.push({ $lookup: {
|
|
277
|
+
from: field.lookup_collection,
|
|
278
|
+
localField: field.lookup_local_key,
|
|
279
|
+
foreignField: field.lookup_foreign_key,
|
|
280
|
+
as: field.lookup_as.replace(/\.\$/g, '')
|
|
281
|
+
} });
|
|
282
|
+
sizes.push(field.lookup_as.replace(/\.\$\./g, '_'));
|
|
283
|
+
query.push({ $addFields: (_a = {}, _a['size_' + field.lookup_as.replace(/\.\$\./g, '_')] = { $size: '$' + field.lookup_as.replace(/\.\$/g, '') }, _a) });
|
|
284
|
+
query.push({ '$unwind': { path: '$' + field.lookup_as.replace(/\.\$/g, ''), preserveNullAndEmptyArrays: true } });
|
|
285
|
+
}
|
|
282
286
|
}
|
|
283
287
|
else {
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
288
|
+
if (!query.some(function (a) { return a.$addFields && Object.keys(a.$addFields).includes('size_' + fieldPath_1.replace(/\./g, '_')); })) {
|
|
289
|
+
sizes.push(fieldPath_1.replace(/\./g, '_'));
|
|
290
|
+
query.push({ $addFields: (_b = {}, _b['size_' + fieldPath_1.replace(/\./g, '_')] = { $size: '$' + fieldPath_1 }, _b) });
|
|
291
|
+
query.push({ '$unwind': { path: '$' + fieldPath_1, preserveNullAndEmptyArrays: true } });
|
|
292
|
+
}
|
|
287
293
|
}
|
|
288
294
|
}
|
|
289
295
|
}
|
|
290
296
|
});
|
|
291
297
|
divFields = { $addFields: {} };
|
|
292
298
|
fieldsTotal.filter(function (a) { return a.type === 'sum'; }).forEach(function (total) {
|
|
293
|
-
selectedFields.filter(function (a) { return
|
|
299
|
+
selectedFields.filter(function (a) { return a.fieldType === 'Number'; }).forEach(function (field) {
|
|
294
300
|
var multFields = [];
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
301
|
+
if (!field.fieldPath.includes('.$')) {
|
|
302
|
+
sizes.forEach(function (size) {
|
|
303
|
+
multFields.push({ $cond: { if: { $gt: ['$size_' + size, 0] }, then: '$size_' + size, else: 1 } });
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
sizes.filter(function (a) { return !field.fieldPath.replace(/\.\$\./g, '_').includes(a) && !fieldsLink.some(function (b) { return b.field_first.replace(/\.\$\./g, '_').includes(a) || b.field_second.replace(/\.\$\./g, '_').includes(a); }); }).forEach(function (size) {
|
|
308
|
+
multFields.push({ $cond: { if: { $gt: ['$size_' + size, 0] }, then: '$size_' + size, else: 1 } });
|
|
309
|
+
});
|
|
310
|
+
}
|
|
298
311
|
if (multFields.length) {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
312
|
+
if (field.leafValueType === 'Count') {
|
|
313
|
+
divFields.$addFields[total.id + '_' + field.id] = {
|
|
314
|
+
$divide: ['$count', { $multiply: multFields }]
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
divFields.$addFields[total.id + '_' + field.id] = {
|
|
319
|
+
$divide: ['$' + field.fieldPath.replace(/\.\$/g, ''), { $multiply: multFields }]
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
if (field.leafValueType === 'Count') {
|
|
325
|
+
divFields.$addFields[total.id + '_' + field.id] = '$count';
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
divFields.$addFields[total.id + '_' + field.id] = '$' + field.fieldPath.replace(/\.\$/g, '');
|
|
329
|
+
}
|
|
302
330
|
}
|
|
303
331
|
});
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
332
|
+
});
|
|
333
|
+
selectedFields.filter(function (a) { return a.fieldType === 'Number' && a.leafValueType === 'Sum'; }).forEach(function (field) {
|
|
334
|
+
var multFields = [];
|
|
335
|
+
if (field.fieldPath.includes('.$')) {
|
|
336
|
+
sizes.filter(function (a) { return !field.fieldPath.replace(/\.\$\./g, '_').includes(a) && !groupsRow.some(function (b) { return b.field.replace(/\.\$\./g, '_').includes(a); }) && !fieldsLink.some(function (b) { return b.field_first.replace(/\.\$\./g, '_').includes(a) || b.field_second.replace(/\.\$\./g, '_').includes(a); }); }).forEach(function (size) {
|
|
307
337
|
multFields.push({ $cond: { if: { $gt: ['$size_' + size, 0] }, then: '$size_' + size, else: 1 } });
|
|
308
338
|
});
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
}
|
|
313
|
-
}
|
|
339
|
+
}
|
|
340
|
+
if (multFields.length) {
|
|
341
|
+
divFields.$addFields[field.fieldPath.replace(/\.\$/g, '')] = {
|
|
342
|
+
$divide: ['$' + field.fieldPath.replace(/\.\$/g, ''), { $multiply: multFields }]
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
selectedFields.filter(function (a) { return a.fieldType === 'Number' && a.leafValueType === 'Count'; }).forEach(function (field) {
|
|
347
|
+
var multFields = [];
|
|
348
|
+
sizes.filter(function (a) { return !field.fieldPath.replace(/\.\$\./g, '_').includes(a) && !groupsRow.some(function (b) { return b.field.replace(/\.\$\./g, '_').includes(a); }) && !fieldsLink.some(function (b) { return b.field_first.replace(/\.\$\./g, '_').includes(a) || b.field_second.replace(/\.\$\./g, '_').includes(a); }); }).forEach(function (size) {
|
|
349
|
+
multFields.push({ $cond: { if: { $gt: ['$size_' + size, 0] }, then: '$size_' + size, else: 1 } });
|
|
314
350
|
});
|
|
351
|
+
if (multFields.length) {
|
|
352
|
+
divFields.$addFields['count_' + field.fieldPath.replace(/\.\$/g, '')] = {
|
|
353
|
+
$divide: ['$count', { $multiply: multFields }]
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
divFields.$addFields['count_' + field.fieldPath.replace(/\.\$/g, '')] = '$count';
|
|
358
|
+
}
|
|
315
359
|
});
|
|
316
360
|
if (Object.keys(divFields.$addFields).length > 0) {
|
|
317
361
|
query.push(divFields);
|
|
318
362
|
}
|
|
363
|
+
fieldsLink.filter(function (a) { return a.field_first && a.field_second; }).forEach(function (link) {
|
|
364
|
+
var _a, _b;
|
|
365
|
+
query.push({ $addFields: (_a = {}, _a[link.id] = { $cmp: ['$' + link.field_first.replace(/\.\$/g, ''), '$' + link.field_second.replace(/\.\$/g, '')] }, _a) });
|
|
366
|
+
query.push({ $match: (_b = {}, _b[link.id] = 0, _b) });
|
|
367
|
+
});
|
|
319
368
|
queryGroup = {
|
|
320
369
|
_id: {}
|
|
321
370
|
};
|
|
@@ -355,7 +404,7 @@ function loadReportBuilderMethods(methodManager) {
|
|
|
355
404
|
queryGroup[field.id] = { '$sum': '$' + field.fieldPath.replace(/\.\$/g, '') };
|
|
356
405
|
}
|
|
357
406
|
else if (field.leafValueType === 'Count') {
|
|
358
|
-
queryGroup[field.id] = { '$sum':
|
|
407
|
+
queryGroup[field.id] = { '$sum': '$count_' + field.fieldPath.replace(/\.\$/g, '') };
|
|
359
408
|
}
|
|
360
409
|
else if (field.leafValueType === 'Minimum') {
|
|
361
410
|
queryGroup[field.id] = { '$min': '$' + field.fieldPath.replace(/\.\$/g, '') };
|
|
@@ -363,7 +412,7 @@ function loadReportBuilderMethods(methodManager) {
|
|
|
363
412
|
else if (field.leafValueType === 'Maximum') {
|
|
364
413
|
queryGroup[field.id] = { '$max': '$' + field.fieldPath.replace(/\.\$/g, '') };
|
|
365
414
|
}
|
|
366
|
-
else if (field.leafValueType === 'First') {
|
|
415
|
+
else if (field.leafValueType === 'First' || (!groupsRow.length && !field.fieldPath.includes('.$'))) {
|
|
367
416
|
queryGroup[field.id] = { '$first': '$' + field.fieldPath.replace(/\.\$/g, '') };
|
|
368
417
|
}
|
|
369
418
|
else if (field.leafValueType === 'Last') {
|
|
@@ -409,10 +458,10 @@ function loadReportBuilderMethods(methodManager) {
|
|
|
409
458
|
fieldsTotal.forEach(function (totField) {
|
|
410
459
|
selectedFields.filter(function (b) { return b.fieldType === 'Number'; }).forEach(function (selField) {
|
|
411
460
|
if (totField.type === 'sum') {
|
|
412
|
-
tmpTotals[totField.id + '_' + selField.id] = res.
|
|
461
|
+
tmpTotals[totField.id + '_' + selField.id] = res.map(function (a) { return a[totField.id + '_' + selField.id] || 0; }).reduce(function (a, b) { return a + b; }, 0);
|
|
413
462
|
}
|
|
414
463
|
else if (totField.type === 'avg') {
|
|
415
|
-
tmpTotals[totField.id + '_' + selField.id] = Math.round(res.
|
|
464
|
+
tmpTotals[totField.id + '_' + selField.id] = Math.round(res.map(function (a) { return a[totField.id + '_' + selField.id] || 0; }).reduce(function (a, b) { return a + b; }, 0) / res.length);
|
|
416
465
|
}
|
|
417
466
|
});
|
|
418
467
|
});
|