@resolveio/server-lib 20.12.55 → 20.12.57

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "20.12.55",
3
+ "version": "20.12.57",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",
@@ -0,0 +1,9 @@
1
+ export declare function normalizeLookupField(path: string): string;
2
+ export declare function applyLinkFieldUnwinds(options: {
3
+ query: any[];
4
+ sizes: string[];
5
+ fieldsLink: any[];
6
+ selectedFields?: any[];
7
+ filterArrayFields?: any[];
8
+ groupsRow?: any[];
9
+ }): void;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeLookupField = normalizeLookupField;
4
+ exports.applyLinkFieldUnwinds = applyLinkFieldUnwinds;
5
+ function normalizeLookupField(path) {
6
+ if (!path) {
7
+ return path;
8
+ }
9
+ var cleaned = path.replace(/\.\$/g, '');
10
+ cleaned = cleaned.replace(/^[^\.]*\(.*?Lookup.*?\)\.?/, '');
11
+ return cleaned;
12
+ }
13
+ function applyLinkFieldUnwinds(options) {
14
+ var _a = options || {}, query = _a.query, sizes = _a.sizes, fieldsLink = _a.fieldsLink, _b = _a.selectedFields, selectedFields = _b === void 0 ? [] : _b, _c = _a.filterArrayFields, filterArrayFields = _c === void 0 ? [] : _c, _d = _a.groupsRow, groupsRow = _d === void 0 ? [] : _d;
15
+ if (!query || !Array.isArray(query) || !sizes || !Array.isArray(sizes) || !Array.isArray(fieldsLink) || !fieldsLink.length) {
16
+ return;
17
+ }
18
+ var leafByPath = new Map();
19
+ (selectedFields || []).forEach(function (field) {
20
+ if ((field === null || field === void 0 ? void 0 : field.fieldPath) && !leafByPath.has(field.fieldPath)) {
21
+ leafByPath.set(field.fieldPath, field);
22
+ }
23
+ });
24
+ (filterArrayFields || []).forEach(function (field) {
25
+ if ((field === null || field === void 0 ? void 0 : field.fieldPath) && !leafByPath.has(field.fieldPath)) {
26
+ leafByPath.set(field.fieldPath, field);
27
+ }
28
+ });
29
+ (groupsRow || []).forEach(function (group) {
30
+ var _a;
31
+ if (((_a = group === null || group === void 0 ? void 0 : group.treeItem) === null || _a === void 0 ? void 0 : _a.fieldPath) && !leafByPath.has(group.treeItem.fieldPath)) {
32
+ leafByPath.set(group.treeItem.fieldPath, group.treeItem);
33
+ }
34
+ });
35
+ var hasUnwindPath = function (unwindPath) {
36
+ return query.some(function (a) { return a && a.$unwind && a.$unwind.path === unwindPath; });
37
+ };
38
+ var ensureUnwindsForPath = function (targetPath) {
39
+ if (!targetPath || typeof targetPath !== 'string' || !targetPath.includes('.$')) {
40
+ return;
41
+ }
42
+ var leaf = leafByPath.get(targetPath);
43
+ var fieldData = targetPath.split('.$');
44
+ var fieldPath = '';
45
+ var _loop_1 = function (i) {
46
+ var _a, _b;
47
+ fieldPath += fieldData[i];
48
+ var lastSegment = fieldPath.split('.$')[fieldPath.split('.$').length - 1];
49
+ var hasLookup = (lastSegment || '').includes('(Lookup') || ((leaf === null || leaf === void 0 ? void 0 : leaf.lookup_as) && fieldPath === leaf.lookup_as);
50
+ if (hasLookup && (leaf === null || leaf === void 0 ? void 0 : leaf.lookup_collection) && (leaf === null || leaf === void 0 ? void 0 : leaf.lookup_as)) {
51
+ var lookupAsRaw = leaf.lookup_as || '';
52
+ var lookupAs_1 = lookupAsRaw.replace(/\.\$/g, '');
53
+ var hasLookupStage = query.some(function (a) { return a && a.$lookup && a.$lookup.as === lookupAs_1; });
54
+ if (!hasLookupStage) {
55
+ query.push({ $lookup: {
56
+ from: leaf.lookup_collection,
57
+ localField: normalizeLookupField(leaf.lookup_local_key || ''),
58
+ foreignField: normalizeLookupField(leaf.lookup_foreign_key || ''),
59
+ as: lookupAs_1
60
+ } });
61
+ }
62
+ var sizeKey_1 = lookupAsRaw.replace(/\.\$\./g, '_').replace(/\./g, '_');
63
+ if (!query.some(function (a) { return a && a.$addFields && Object.keys(a.$addFields).includes('size_' + sizeKey_1); })) {
64
+ sizes.push(sizeKey_1);
65
+ query.push({ $addFields: (_a = {}, _a['size_' + sizeKey_1] = { $size: { $ifNull: ['$' + lookupAs_1.replace(/\./g, '_'), []] } }, _a) });
66
+ }
67
+ var unwindPath = '$' + lookupAs_1;
68
+ if (!hasUnwindPath(unwindPath)) {
69
+ query.push({ '$unwind': { path: unwindPath, preserveNullAndEmptyArrays: true } });
70
+ }
71
+ }
72
+ else {
73
+ var sizeKey_2 = fieldPath.replace(/\.\$\./g, '.').replace(/\./g, '_');
74
+ if (!query.some(function (a) { return a && a.$addFields && Object.keys(a.$addFields).includes('size_' + sizeKey_2); })) {
75
+ sizes.push(sizeKey_2);
76
+ query.push({ $addFields: (_b = {}, _b['size_' + sizeKey_2] = { $size: { $ifNull: ['$' + fieldPath.replace(/\.\$\./g, '.'), []] } }, _b) });
77
+ }
78
+ var unwindPath = '$' + fieldPath.replace(/\.\$\./g, '.');
79
+ if (!hasUnwindPath(unwindPath)) {
80
+ query.push({ '$unwind': { path: unwindPath, preserveNullAndEmptyArrays: true } });
81
+ }
82
+ }
83
+ fieldPath += '.$';
84
+ };
85
+ for (var i = 0; i < fieldData.length - 1; i++) {
86
+ _loop_1(i);
87
+ }
88
+ };
89
+ (fieldsLink || [])
90
+ .filter(function (a) { return a && a.field_first && a.field_second; })
91
+ .forEach(function (link) {
92
+ ensureUnwindsForPath(link.field_first);
93
+ ensureUnwindsForPath(link.field_second);
94
+ });
95
+ }
96
+
97
+ //# sourceMappingURL=report-builder-unwinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/util/report-builder-unwinds.ts"],"names":[],"mappings":"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","file":"report-builder-unwinds.js","sourcesContent":["export function normalizeLookupField(path: string) {\n\tif (!path) {\n\t\treturn path;\n\t}\n\n\tlet cleaned = path.replace(/\\.\\$/g, '');\n\tcleaned = cleaned.replace(/^[^\\.]*\\(.*?Lookup.*?\\)\\.?/, '');\n\n\treturn cleaned;\n}\n\nexport function applyLinkFieldUnwinds(options: {\n\tquery: any[];\n\tsizes: string[];\n\tfieldsLink: any[];\n\tselectedFields?: any[];\n\tfilterArrayFields?: any[];\n\tgroupsRow?: any[];\n}) {\n\tconst {query, sizes, fieldsLink, selectedFields = [], filterArrayFields = [], groupsRow = []} = options || {};\n\n\tif (!query || !Array.isArray(query) || !sizes || !Array.isArray(sizes) || !Array.isArray(fieldsLink) || !fieldsLink.length) {\n\t\treturn;\n\t}\n\n\tconst leafByPath = new Map<string, any>();\n\n\t(selectedFields || []).forEach(field => {\n\t\tif (field?.fieldPath && !leafByPath.has(field.fieldPath)) {\n\t\t\tleafByPath.set(field.fieldPath, field);\n\t\t}\n\t});\n\n\t(filterArrayFields || []).forEach(field => {\n\t\tif (field?.fieldPath && !leafByPath.has(field.fieldPath)) {\n\t\t\tleafByPath.set(field.fieldPath, field);\n\t\t}\n\t});\n\n\t(groupsRow || []).forEach(group => {\n\t\tif (group?.treeItem?.fieldPath && !leafByPath.has(group.treeItem.fieldPath)) {\n\t\t\tleafByPath.set(group.treeItem.fieldPath, group.treeItem);\n\t\t}\n\t});\n\n\tconst hasUnwindPath = (unwindPath: string) => {\n\t\treturn query.some(a => a && a.$unwind && a.$unwind.path === unwindPath);\n\t};\n\n\tconst ensureUnwindsForPath = (targetPath: string) => {\n\t\tif (!targetPath || typeof targetPath !== 'string' || !targetPath.includes('.$')) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst leaf = leafByPath.get(targetPath);\n\n\t\tconst fieldData = targetPath.split('.$');\n\t\tlet fieldPath = '';\n\n\t\tfor (let i = 0; i < fieldData.length - 1; i++) {\n\t\t\tfieldPath += fieldData[i];\n\n\t\t\tconst lastSegment = fieldPath.split('.$')[fieldPath.split('.$').length - 1];\n\t\t\tconst hasLookup = (lastSegment || '').includes('(Lookup') || (leaf?.lookup_as && fieldPath === leaf.lookup_as);\n\n\t\t\tif (hasLookup && leaf?.lookup_collection && leaf?.lookup_as) {\n\t\t\t\tconst lookupAsRaw = leaf.lookup_as || '';\n\t\t\t\tconst lookupAs = lookupAsRaw.replace(/\\.\\$/g, '');\n\t\t\t\tconst hasLookupStage = query.some(a => a && a.$lookup && a.$lookup.as === lookupAs);\n\n\t\t\t\tif (!hasLookupStage) {\n\t\t\t\t\tquery.push({$lookup: {\n\t\t\t\t\t\tfrom: leaf.lookup_collection,\n\t\t\t\t\t\tlocalField: normalizeLookupField(leaf.lookup_local_key || ''),\n\t\t\t\t\t\tforeignField: normalizeLookupField(leaf.lookup_foreign_key || ''),\n\t\t\t\t\t\tas: lookupAs\n\t\t\t\t\t}});\n\t\t\t\t}\n\n\t\t\t\tconst sizeKey = lookupAsRaw.replace(/\\.\\$\\./g, '_').replace(/\\./g, '_');\n\t\t\t\tif (!query.some(a => a && a.$addFields && Object.keys(a.$addFields).includes('size_' + sizeKey))) {\n\t\t\t\t\tsizes.push(sizeKey);\n\t\t\t\t\tquery.push({$addFields: {['size_' + sizeKey]: {$size: {$ifNull: ['$' + lookupAs.replace(/\\./g, '_'), []]}}}});\n\t\t\t\t}\n\n\t\t\t\tconst unwindPath = '$' + lookupAs;\n\t\t\t\tif (!hasUnwindPath(unwindPath)) {\n\t\t\t\t\tquery.push({'$unwind': {path: unwindPath, preserveNullAndEmptyArrays: true}});\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst sizeKey = fieldPath.replace(/\\.\\$\\./g, '.').replace(/\\./g, '_');\n\t\t\t\tif (!query.some(a => a && a.$addFields && Object.keys(a.$addFields).includes('size_' + sizeKey))) {\n\t\t\t\t\tsizes.push(sizeKey);\n\t\t\t\t\tquery.push({$addFields: {['size_' + sizeKey]: {$size: {$ifNull: ['$' + fieldPath.replace(/\\.\\$\\./g, '.'), []]}}}});\n\t\t\t\t}\n\n\t\t\t\tconst unwindPath = '$' + fieldPath.replace(/\\.\\$\\./g, '.');\n\t\t\t\tif (!hasUnwindPath(unwindPath)) {\n\t\t\t\t\tquery.push({'$unwind': {path: unwindPath, preserveNullAndEmptyArrays: true}});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfieldPath += '.$';\n\t\t}\n\t};\n\n\t(fieldsLink || [])\n\t\t.filter(a => a && a.field_first && a.field_second)\n\t\t.forEach(link => {\n\t\t\tensureUnwindsForPath(link.field_first);\n\t\t\tensureUnwindsForPath(link.field_second);\n\t\t});\n}\n\n"]}