tm1npm 1.5.2 → 1.5.3
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/jest.ci.config.js +2 -0
- package/lib/objects/Axis.d.ts +3 -2
- package/lib/objects/Axis.d.ts.map +1 -1
- package/lib/objects/Axis.js +49 -8
- package/lib/objects/ElementAttribute.d.ts.map +1 -1
- package/lib/objects/ElementAttribute.js +3 -2
- package/lib/objects/Hierarchy.d.ts +9 -2
- package/lib/objects/Hierarchy.d.ts.map +1 -1
- package/lib/objects/Hierarchy.js +147 -16
- package/lib/objects/MDXView.d.ts +4 -1
- package/lib/objects/MDXView.d.ts.map +1 -1
- package/lib/objects/MDXView.js +12 -2
- package/lib/objects/NativeView.d.ts +3 -0
- package/lib/objects/NativeView.d.ts.map +1 -1
- package/lib/objects/NativeView.js +41 -45
- package/lib/services/ApplicationService.js +3 -3
- package/lib/services/CellService.d.ts +18 -16
- package/lib/services/CellService.d.ts.map +1 -1
- package/lib/services/CellService.js +72 -45
- package/lib/services/CubeService.d.ts +3 -6
- package/lib/services/CubeService.d.ts.map +1 -1
- package/lib/services/CubeService.js +83 -90
- package/lib/services/ElementService.d.ts +13 -14
- package/lib/services/ElementService.d.ts.map +1 -1
- package/lib/services/ElementService.js +80 -104
- package/lib/services/FileService.d.ts.map +1 -1
- package/lib/services/FileService.js +9 -0
- package/lib/services/HierarchyService.d.ts +2 -12
- package/lib/services/HierarchyService.d.ts.map +1 -1
- package/lib/services/HierarchyService.js +59 -153
- package/lib/services/MessageLogService.js +3 -3
- package/lib/services/ProcessService.d.ts +58 -15
- package/lib/services/ProcessService.d.ts.map +1 -1
- package/lib/services/ProcessService.js +268 -175
- package/lib/services/SecurityService.d.ts +2 -2
- package/lib/services/SecurityService.d.ts.map +1 -1
- package/lib/services/SecurityService.js +18 -12
- package/lib/services/ServerService.d.ts +2 -2
- package/lib/services/ServerService.d.ts.map +1 -1
- package/lib/services/SessionService.js +1 -1
- package/lib/services/SubsetService.d.ts.map +1 -1
- package/lib/services/SubsetService.js +4 -4
- package/lib/services/ViewService.js +2 -2
- package/lib/tests/bugfix28.test.d.ts +10 -0
- package/lib/tests/bugfix28.test.d.ts.map +1 -0
- package/lib/tests/bugfix28.test.js +178 -0
- package/lib/tests/cellService.test.js +91 -55
- package/lib/tests/comprehensive.service.test.js +14 -16
- package/lib/tests/cubeService.getAllNames.test.js +2 -2
- package/lib/tests/dimensionService.comprehensive.test.js +7 -7
- package/lib/tests/elementService.comprehensive.test.js +99 -82
- package/lib/tests/enhancedCellService.test.js +8 -8
- package/lib/tests/enhancedCubeService.test.js +79 -86
- package/lib/tests/enhancedElementService.test.js +22 -24
- package/lib/tests/hierarchyService.test.d.ts +1 -1
- package/lib/tests/hierarchyService.test.js +275 -206
- package/lib/tests/mdx.advanced.test.js +27 -83
- package/lib/tests/objectModelParity.test.d.ts +6 -0
- package/lib/tests/objectModelParity.test.d.ts.map +1 -0
- package/lib/tests/objectModelParity.test.js +511 -0
- package/lib/tests/processService.comprehensive.test.js +354 -142
- package/lib/tests/processService.test.js +15 -20
- package/lib/tests/security.advanced.test.js +5 -0
- package/lib/tests/securityService.comprehensive.test.js +50 -29
- package/lib/tests/simpleCoverage.test.js +11 -15
- package/lib/utils/Utils.d.ts +2 -0
- package/lib/utils/Utils.d.ts.map +1 -1
- package/lib/utils/Utils.js +11 -0
- package/package.json +1 -1
- package/src/objects/Axis.ts +55 -15
- package/src/objects/ElementAttribute.ts +3 -2
- package/src/objects/Hierarchy.ts +181 -35
- package/src/objects/MDXView.ts +17 -3
- package/src/objects/NativeView.ts +56 -53
- package/src/services/ApplicationService.ts +3 -3
- package/src/services/CellService.ts +101 -62
- package/src/services/CubeService.ts +99 -112
- package/src/services/ElementService.ts +120 -144
- package/src/services/FileService.ts +14 -0
- package/src/services/HierarchyService.ts +86 -192
- package/src/services/MessageLogService.ts +3 -3
- package/src/services/ProcessService.ts +365 -194
- package/src/services/SecurityService.ts +24 -16
- package/src/services/ServerService.ts +3 -3
- package/src/services/SessionService.ts +1 -1
- package/src/services/SubsetService.ts +4 -4
- package/src/services/ViewService.ts +2 -2
- package/src/tests/bugfix28.test.ts +236 -0
- package/src/tests/cellService.test.ts +138 -85
- package/src/tests/comprehensive.service.test.ts +23 -27
- package/src/tests/cubeService.getAllNames.test.ts +2 -2
- package/src/tests/dimensionService.comprehensive.test.ts +7 -7
- package/src/tests/elementService.comprehensive.test.ts +123 -106
- package/src/tests/enhancedCellService.test.ts +15 -14
- package/src/tests/enhancedCubeService.test.ts +100 -131
- package/src/tests/enhancedElementService.test.ts +26 -31
- package/src/tests/hierarchyService.test.ts +344 -243
- package/src/tests/mdx.advanced.test.ts +35 -89
- package/src/tests/objectModelParity.test.ts +574 -0
- package/src/tests/processService.comprehensive.test.ts +507 -193
- package/src/tests/processService.test.ts +23 -24
- package/src/tests/security.advanced.test.ts +6 -0
- package/src/tests/securityService.comprehensive.test.ts +81 -49
- package/src/tests/simpleCoverage.test.ts +14 -18
- package/src/utils/Utils.ts +11 -0
package/jest.ci.config.js
CHANGED
|
@@ -19,6 +19,8 @@ module.exports = {
|
|
|
19
19
|
'.*integration.*\\.test\\.ts$', // Exclude ALL integration tests
|
|
20
20
|
'.*performance\\.test\\.ts$', // May require connection
|
|
21
21
|
'.*security\\.test\\.ts$', // May require connection setup
|
|
22
|
+
'.*security\\.advanced\\.test\\.ts$', // Advanced security tests with connection mocks
|
|
23
|
+
'.*mdx\\.advanced\\.test\\.ts$', // Advanced MDX tests with complex mocks
|
|
22
24
|
'.*stress\\.performance\\.test\\.ts$', // Performance tests with connections
|
|
23
25
|
'.*errorHandling\\.test\\.ts$', // May test real error scenarios
|
|
24
26
|
'.*integrationTests\\.test\\.ts$' // Additional integration test pattern
|
package/lib/objects/Axis.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export declare class ViewAxisSelection extends TM1Object {
|
|
|
12
12
|
get hierarchyName(): string;
|
|
13
13
|
get body(): string;
|
|
14
14
|
get bodyAsDict(): Record<string, any>;
|
|
15
|
-
static fromDict(
|
|
15
|
+
static fromDict(data: Record<string, any>): ViewAxisSelection;
|
|
16
16
|
private constructBody;
|
|
17
17
|
}
|
|
18
18
|
export declare class ViewTitleSelection {
|
|
@@ -28,9 +28,10 @@ export declare class ViewTitleSelection {
|
|
|
28
28
|
get dimensionName(): string;
|
|
29
29
|
get hierarchyName(): string;
|
|
30
30
|
get selected(): string;
|
|
31
|
+
set selected(value: string);
|
|
31
32
|
get body(): string;
|
|
32
33
|
get bodyAsDict(): Record<string, any>;
|
|
33
|
-
static fromDict(
|
|
34
|
+
static fromDict(data: Record<string, any>): ViewTitleSelection;
|
|
34
35
|
private constructBody;
|
|
35
36
|
}
|
|
36
37
|
//# sourceMappingURL=Axis.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Axis.d.ts","sourceRoot":"","sources":["../../src/objects/Axis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGnD,qBAAa,iBAAkB,SAAQ,SAAS;IAC5C;OACG;IAEH,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAS;gBAEnB,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe;IAYnE,IAAW,MAAM,IAAI,MAAM,GAAG,eAAe,CAE5C;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAE3C;WAEa,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"Axis.d.ts","sourceRoot":"","sources":["../../src/objects/Axis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGnD,qBAAa,iBAAkB,SAAQ,SAAS;IAC5C;OACG;IAEH,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAS;gBAEnB,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe;IAYnE,IAAW,MAAM,IAAI,MAAM,GAAG,eAAe,CAE5C;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAE3C;WAEa,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,iBAAiB;IAepE,OAAO,CAAC,aAAa;CAqBxB;AAGD,qBAAa,kBAAkB;IAC3B;;OAEG;IAEH,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,SAAS,CAAS;gBAEd,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM;IAOrF,IAAW,MAAM,IAAI,MAAM,GAAG,eAAe,CAE5C;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAED,IAAW,QAAQ,CAAC,KAAK,EAAE,MAAM,EAEhC;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAE3C;WAEa,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,kBAAkB;IA+BrE,OAAO,CAAC,aAAa;CA6BxB"}
|
package/lib/objects/Axis.js
CHANGED
|
@@ -14,7 +14,7 @@ class ViewAxisSelection extends TM1Object_1.TM1Object {
|
|
|
14
14
|
super();
|
|
15
15
|
this._subset = subset;
|
|
16
16
|
this._dimensionName = dimensionName;
|
|
17
|
-
this._hierarchyName = dimensionName;
|
|
17
|
+
this._hierarchyName = subset.hierarchyName || dimensionName;
|
|
18
18
|
}
|
|
19
19
|
get subset() {
|
|
20
20
|
return this._subset;
|
|
@@ -31,9 +31,20 @@ class ViewAxisSelection extends TM1Object_1.TM1Object {
|
|
|
31
31
|
get bodyAsDict() {
|
|
32
32
|
return this.constructBody();
|
|
33
33
|
}
|
|
34
|
-
static fromDict(
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
static fromDict(data) {
|
|
35
|
+
if ('Subset' in data) {
|
|
36
|
+
const subset = Subset_1.AnonymousSubset.fromDict(data['Subset']);
|
|
37
|
+
return new ViewAxisSelection(subset.dimensionName, subset);
|
|
38
|
+
}
|
|
39
|
+
else if ('Subset@odata.bind' in data) {
|
|
40
|
+
const parts = (0, Utils_1.parseODataBindUrl)(data['Subset@odata.bind']);
|
|
41
|
+
const dimName = parts[0] || '';
|
|
42
|
+
const hierName = parts[1] || '';
|
|
43
|
+
const subsetName = parts[2] || '';
|
|
44
|
+
const subset = new Subset_1.Subset(subsetName, dimName, hierName);
|
|
45
|
+
return new ViewAxisSelection(dimName, subset);
|
|
46
|
+
}
|
|
47
|
+
throw new Error("ViewAxisSelection dict must contain 'Subset' or 'Subset@odata.bind'");
|
|
37
48
|
}
|
|
38
49
|
constructBody() {
|
|
39
50
|
/** construct the ODATA conform JSON represenation for the ViewAxisSelection entity.
|
|
@@ -55,7 +66,7 @@ exports.ViewAxisSelection = ViewAxisSelection;
|
|
|
55
66
|
class ViewTitleSelection {
|
|
56
67
|
constructor(dimensionName, subset, selected) {
|
|
57
68
|
this._dimensionName = dimensionName;
|
|
58
|
-
this._hierarchyName = dimensionName;
|
|
69
|
+
this._hierarchyName = subset.hierarchyName || dimensionName;
|
|
59
70
|
this._subset = subset;
|
|
60
71
|
this._selected = selected;
|
|
61
72
|
}
|
|
@@ -71,15 +82,45 @@ class ViewTitleSelection {
|
|
|
71
82
|
get selected() {
|
|
72
83
|
return this._selected;
|
|
73
84
|
}
|
|
85
|
+
set selected(value) {
|
|
86
|
+
this._selected = value;
|
|
87
|
+
}
|
|
74
88
|
get body() {
|
|
75
89
|
return JSON.stringify(this.constructBody());
|
|
76
90
|
}
|
|
77
91
|
get bodyAsDict() {
|
|
78
92
|
return this.constructBody();
|
|
79
93
|
}
|
|
80
|
-
static fromDict(
|
|
81
|
-
|
|
82
|
-
|
|
94
|
+
static fromDict(data) {
|
|
95
|
+
let subset;
|
|
96
|
+
let dimName;
|
|
97
|
+
if ('Subset' in data) {
|
|
98
|
+
subset = Subset_1.AnonymousSubset.fromDict(data['Subset']);
|
|
99
|
+
dimName = subset.dimensionName;
|
|
100
|
+
}
|
|
101
|
+
else if ('Subset@odata.bind' in data) {
|
|
102
|
+
const parts = (0, Utils_1.parseODataBindUrl)(data['Subset@odata.bind']);
|
|
103
|
+
dimName = parts[0] || '';
|
|
104
|
+
const hierName = parts[1] || '';
|
|
105
|
+
const subsetName = parts[2] || '';
|
|
106
|
+
subset = new Subset_1.Subset(subsetName, dimName, hierName);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
throw new Error("ViewTitleSelection dict must contain 'Subset' or 'Subset@odata.bind'");
|
|
110
|
+
}
|
|
111
|
+
let selected;
|
|
112
|
+
if ('Selected@odata.bind' in data) {
|
|
113
|
+
// URL format: Dimensions('D')/Hierarchies('H')/Elements('E')
|
|
114
|
+
const parts = (0, Utils_1.parseODataBindUrl)(data['Selected@odata.bind']);
|
|
115
|
+
selected = parts[2] || '';
|
|
116
|
+
}
|
|
117
|
+
else if ('Selected' in data && data['Selected']) {
|
|
118
|
+
selected = data['Selected'].Name || '';
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
selected = '';
|
|
122
|
+
}
|
|
123
|
+
return new ViewTitleSelection(dimName, subset, selected);
|
|
83
124
|
}
|
|
84
125
|
constructBody() {
|
|
85
126
|
/** construct the ODATA conform JSON represenation for the ViewTitleSelection entity.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElementAttribute.d.ts","sourceRoot":"","sources":["../../src/objects/ElementAttribute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ElementAttribute.d.ts","sourceRoot":"","sources":["../../src/objects/ElementAttribute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,oBAAY,oBAAoB;IAC5B,OAAO,IAAI;IACX,MAAM,IAAI;IACV,KAAK,IAAI;CACZ;AAED,qBAAa,gBAAiB,SAAQ,SAAS;IAC3C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAAuB;gBAEjC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,oBAAoB,GAAG,MAAM;IAMtE,OAAO,CAAC,kBAAkB;WAiBZ,QAAQ,CAAC,sBAAsB,EAAE,MAAM,GAAG,gBAAgB;WAI1D,QAAQ,CAAC,sBAAsB,EAAE,GAAG,GAAG,gBAAgB;IAOrE,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,IAAI,CAAC,KAAK,EAAE,MAAM,EAE5B;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,aAAa,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,EAE5D;IAED,IAAW,iBAAiB,IAAI,oBAAoB,CAEnD;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,GAAG,CAK3B;IAED,OAAO,CAAC,qBAAqB;IAatB,SAAS,IAAI,OAAO;IAIpB,QAAQ,IAAI,OAAO;IAInB,OAAO,IAAI,OAAO;IAIlB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAQjC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAI9C"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ElementAttribute = exports.ElementAttributeType = void 0;
|
|
4
4
|
const TM1Object_1 = require("./TM1Object");
|
|
5
|
+
const Utils_1 = require("../utils/Utils");
|
|
5
6
|
var ElementAttributeType;
|
|
6
7
|
(function (ElementAttributeType) {
|
|
7
8
|
ElementAttributeType[ElementAttributeType["NUMERIC"] = 1] = "NUMERIC";
|
|
@@ -83,8 +84,8 @@ class ElementAttribute extends TM1Object_1.TM1Object {
|
|
|
83
84
|
}
|
|
84
85
|
equals(other) {
|
|
85
86
|
if (other instanceof ElementAttribute) {
|
|
86
|
-
return this._name
|
|
87
|
-
other.
|
|
87
|
+
return (0, Utils_1.caseAndSpaceInsensitiveEquals)(this._name, other._name) &&
|
|
88
|
+
this._attributeType === other._attributeType;
|
|
88
89
|
}
|
|
89
90
|
return false;
|
|
90
91
|
}
|
|
@@ -10,7 +10,7 @@ export declare class Hierarchy extends TM1Object {
|
|
|
10
10
|
private _subsets;
|
|
11
11
|
private _balanced;
|
|
12
12
|
private _defaultMember?;
|
|
13
|
-
constructor(name: string, dimensionName: string, elements?: Element[], elementAttributes?: ElementAttribute[], edges?: Map<string, number
|
|
13
|
+
constructor(name: string, dimensionName: string, elements?: Element[], elementAttributes?: ElementAttribute[], edges?: Map<string, Map<string, number>>, subsets?: string[], structure?: number, defaultMember?: string);
|
|
14
14
|
static fromDict(hierarchyAsDict: any, dimensionName: string): Hierarchy;
|
|
15
15
|
get name(): string;
|
|
16
16
|
set name(value: string);
|
|
@@ -20,7 +20,7 @@ export declare class Hierarchy extends TM1Object {
|
|
|
20
20
|
get elements(): Element[];
|
|
21
21
|
get elementNames(): string[];
|
|
22
22
|
get elementAttributes(): ElementAttribute[];
|
|
23
|
-
get edges(): Map<string, number
|
|
23
|
+
get edges(): Map<string, Map<string, number>>;
|
|
24
24
|
get subsets(): string[];
|
|
25
25
|
get balanced(): boolean;
|
|
26
26
|
set balanced(value: boolean);
|
|
@@ -41,6 +41,13 @@ export declare class Hierarchy extends TM1Object {
|
|
|
41
41
|
removeElementAttribute(attributeName: string): boolean;
|
|
42
42
|
getElementAttribute(attributeName: string): ElementAttribute | undefined;
|
|
43
43
|
hasElementAttribute(attributeName: string): boolean;
|
|
44
|
+
getAncestors(elementName: string, recursive?: boolean): string[];
|
|
45
|
+
getDescendants(elementName: string, recursive?: boolean, leavesOnly?: boolean): string[];
|
|
46
|
+
private buildEdgeMap;
|
|
47
|
+
getDescendantEdges(elementName: string, recursive?: boolean): Map<string, Map<string, number>>;
|
|
48
|
+
getAncestorEdges(elementName: string, recursive?: boolean): Map<string, Map<string, number>>;
|
|
49
|
+
replaceElement(oldName: string, newName: string): void;
|
|
50
|
+
addComponent(parent: string, component: string, weight?: number): void;
|
|
44
51
|
[Symbol.iterator](): Iterator<Element>;
|
|
45
52
|
get length(): number;
|
|
46
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Hierarchy.d.ts","sourceRoot":"","sources":["../../src/objects/Hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"Hierarchy.d.ts","sourceRoot":"","sources":["../../src/objects/Hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAe,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,qBAAa,SAAU,SAAQ,SAAS;IACpC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAC,CAAS;gBAG5B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,OAAO,EAAE,EACpB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,EACtC,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACxC,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM;WAqBZ,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS;IA+B9E,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,IAAI,CAAC,KAAK,EAAE,MAAM,EAE5B;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,aAAa,CAAC,KAAK,EAAE,MAAM,EAErC;IAED,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,IAAW,QAAQ,IAAI,OAAO,EAAE,CAE/B;IAED,IAAW,YAAY,IAAI,MAAM,EAAE,CAElC;IAED,IAAW,iBAAiB,IAAI,gBAAgB,EAAE,CAEjD;IAED,IAAW,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAEnD;IAED,IAAW,OAAO,IAAI,MAAM,EAAE,CAE7B;IAED,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,IAAW,QAAQ,CAAC,KAAK,EAAE,OAAO,EAEjC;IAED,IAAW,aAAa,IAAI,MAAM,GAAG,SAAS,CAE7C;IAED,IAAW,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAEjD;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,GAAG,CAE3B;IAED,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,cAAc;IAgBf,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAI3C,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpD,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIxC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;IAO5E,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAY9D,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI5E,mBAAmB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI;IAI7D,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAWtD,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAKxE,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAKnD,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,MAAM,EAAE;IAgCvE,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,EAAE,UAAU,GAAE,OAAe,GAAG,MAAM,EAAE;IAuC7G,OAAO,CAAC,YAAY;IAYb,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIrG,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAInG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IA4BtD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;IAWxE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC;IAI9C,IAAW,MAAM,IAAI,MAAM,CAE1B;CACJ"}
|
package/lib/objects/Hierarchy.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.Hierarchy = void 0;
|
|
|
4
4
|
const TM1Object_1 = require("./TM1Object");
|
|
5
5
|
const Element_1 = require("./Element");
|
|
6
6
|
const ElementAttribute_1 = require("./ElementAttribute");
|
|
7
|
+
const Utils_1 = require("../utils/Utils");
|
|
7
8
|
class Hierarchy extends TM1Object_1.TM1Object {
|
|
8
9
|
constructor(name, dimensionName, elements, elementAttributes, edges, subsets, structure, defaultMember) {
|
|
9
10
|
super();
|
|
@@ -20,7 +21,9 @@ class Hierarchy extends TM1Object_1.TM1Object {
|
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
this._elementAttributes = elementAttributes ? [...elementAttributes] : [];
|
|
23
|
-
this._edges = edges
|
|
24
|
+
this._edges = edges
|
|
25
|
+
? new Map(Array.from(edges, ([k, v]) => [k, new Map(v)]))
|
|
26
|
+
: new Map();
|
|
24
27
|
this._subsets = subsets ? [...subsets] : [];
|
|
25
28
|
this._balanced = structure !== undefined ? structure === 0 : false;
|
|
26
29
|
this._defaultMember = defaultMember;
|
|
@@ -33,8 +36,12 @@ class Hierarchy extends TM1Object_1.TM1Object {
|
|
|
33
36
|
const edges = new Map();
|
|
34
37
|
if (hierarchyAsDict.Edges) {
|
|
35
38
|
for (const edge of hierarchyAsDict.Edges) {
|
|
36
|
-
const
|
|
37
|
-
|
|
39
|
+
const parentName = edge.ParentName;
|
|
40
|
+
const componentName = edge.ComponentName;
|
|
41
|
+
if (!edges.has(parentName)) {
|
|
42
|
+
edges.set(parentName, new Map());
|
|
43
|
+
}
|
|
44
|
+
edges.get(parentName).set(componentName, edge.Weight || 1);
|
|
38
45
|
}
|
|
39
46
|
}
|
|
40
47
|
return new Hierarchy(hierarchyAsDict.Name, dimensionName, elements, elementAttributes, edges, hierarchyAsDict.Subsets, hierarchyAsDict.Structure, hierarchyAsDict.DefaultMember);
|
|
@@ -103,13 +110,14 @@ class Hierarchy extends TM1Object_1.TM1Object {
|
|
|
103
110
|
}
|
|
104
111
|
constructEdges() {
|
|
105
112
|
const edges = [];
|
|
106
|
-
for (const [
|
|
107
|
-
const [
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
for (const [parentName, children] of this._edges) {
|
|
114
|
+
for (const [componentName, weight] of children) {
|
|
115
|
+
edges.push({
|
|
116
|
+
ParentName: parentName,
|
|
117
|
+
ComponentName: componentName,
|
|
118
|
+
Weight: weight
|
|
119
|
+
});
|
|
120
|
+
}
|
|
113
121
|
}
|
|
114
122
|
return edges;
|
|
115
123
|
}
|
|
@@ -126,16 +134,25 @@ class Hierarchy extends TM1Object_1.TM1Object {
|
|
|
126
134
|
return this._elements.has(elementName.toLowerCase());
|
|
127
135
|
}
|
|
128
136
|
addEdge(parentName, componentName, weight = 1) {
|
|
129
|
-
|
|
130
|
-
|
|
137
|
+
if (!this._edges.has(parentName)) {
|
|
138
|
+
this._edges.set(parentName, new Map());
|
|
139
|
+
}
|
|
140
|
+
this._edges.get(parentName).set(componentName, weight);
|
|
131
141
|
}
|
|
132
142
|
removeEdge(parentName, componentName) {
|
|
133
|
-
const
|
|
134
|
-
|
|
143
|
+
const children = this._edges.get(parentName);
|
|
144
|
+
if (children) {
|
|
145
|
+
const result = children.delete(componentName);
|
|
146
|
+
if (children.size === 0) {
|
|
147
|
+
this._edges.delete(parentName);
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
135
152
|
}
|
|
136
153
|
getEdgeWeight(parentName, componentName) {
|
|
137
|
-
|
|
138
|
-
return this._edges.get(
|
|
154
|
+
var _a;
|
|
155
|
+
return (_a = this._edges.get(parentName)) === null || _a === void 0 ? void 0 : _a.get(componentName);
|
|
139
156
|
}
|
|
140
157
|
addElementAttribute(elementAttribute) {
|
|
141
158
|
this._elementAttributes.push(elementAttribute);
|
|
@@ -154,6 +171,120 @@ class Hierarchy extends TM1Object_1.TM1Object {
|
|
|
154
171
|
hasElementAttribute(attributeName) {
|
|
155
172
|
return this._elementAttributes.some(ea => ea.name.toLowerCase() === attributeName.toLowerCase());
|
|
156
173
|
}
|
|
174
|
+
getAncestors(elementName, recursive = false) {
|
|
175
|
+
const normalizedTarget = (0, Utils_1.lowerAndDropSpaces)(elementName);
|
|
176
|
+
const directParents = [];
|
|
177
|
+
for (const [parent, children] of this._edges) {
|
|
178
|
+
for (const child of children.keys()) {
|
|
179
|
+
if ((0, Utils_1.lowerAndDropSpaces)(child) === normalizedTarget) {
|
|
180
|
+
directParents.push(parent);
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (!recursive) {
|
|
186
|
+
return directParents;
|
|
187
|
+
}
|
|
188
|
+
// BFS; uses non-recursive call to avoid re-scanning for already-visited ancestors
|
|
189
|
+
const result = new Set(directParents);
|
|
190
|
+
const queue = [...directParents];
|
|
191
|
+
while (queue.length > 0) {
|
|
192
|
+
const current = queue.shift();
|
|
193
|
+
for (const ancestor of this.getAncestors(current, false)) {
|
|
194
|
+
if (!result.has(ancestor)) {
|
|
195
|
+
result.add(ancestor);
|
|
196
|
+
queue.push(ancestor);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return Array.from(result);
|
|
201
|
+
}
|
|
202
|
+
getDescendants(elementName, recursive = false, leavesOnly = false) {
|
|
203
|
+
const normalizedTarget = (0, Utils_1.lowerAndDropSpaces)(elementName);
|
|
204
|
+
const directChildren = [];
|
|
205
|
+
for (const [parent, children] of this._edges) {
|
|
206
|
+
if ((0, Utils_1.lowerAndDropSpaces)(parent) === normalizedTarget) {
|
|
207
|
+
directChildren.push(...children.keys());
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
let result;
|
|
211
|
+
if (recursive) {
|
|
212
|
+
const seen = new Set(directChildren);
|
|
213
|
+
const queue = [...directChildren];
|
|
214
|
+
while (queue.length > 0) {
|
|
215
|
+
const current = queue.shift();
|
|
216
|
+
// current comes directly from stored edge values; use O(1) Map lookup
|
|
217
|
+
const grandChildren = this._edges.get(current);
|
|
218
|
+
if (grandChildren) {
|
|
219
|
+
for (const child of grandChildren.keys()) {
|
|
220
|
+
if (!seen.has(child)) {
|
|
221
|
+
seen.add(child);
|
|
222
|
+
queue.push(child);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
result = Array.from(seen);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
result = directChildren;
|
|
231
|
+
}
|
|
232
|
+
if (leavesOnly) {
|
|
233
|
+
const allParents = new Set(Array.from(this._edges.keys()).map(Utils_1.lowerAndDropSpaces));
|
|
234
|
+
return result.filter(d => !allParents.has((0, Utils_1.lowerAndDropSpaces)(d)));
|
|
235
|
+
}
|
|
236
|
+
return result;
|
|
237
|
+
}
|
|
238
|
+
buildEdgeMap(elements) {
|
|
239
|
+
const result = new Map();
|
|
240
|
+
for (const element of elements) {
|
|
241
|
+
// elements come from stored edge keys/values; O(1) lookup suffices
|
|
242
|
+
const children = this._edges.get(element);
|
|
243
|
+
if (children) {
|
|
244
|
+
result.set(element, new Map(children));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
getDescendantEdges(elementName, recursive = false) {
|
|
250
|
+
return this.buildEdgeMap(this.getDescendants(elementName, recursive));
|
|
251
|
+
}
|
|
252
|
+
getAncestorEdges(elementName, recursive = false) {
|
|
253
|
+
return this.buildEdgeMap(this.getAncestors(elementName, recursive));
|
|
254
|
+
}
|
|
255
|
+
replaceElement(oldName, newName) {
|
|
256
|
+
const normalizedOld = (0, Utils_1.lowerAndDropSpaces)(oldName);
|
|
257
|
+
// Rename in _elements
|
|
258
|
+
const oldKey = Array.from(this._elements.keys()).find(k => (0, Utils_1.lowerAndDropSpaces)(k) === normalizedOld);
|
|
259
|
+
if (oldKey) {
|
|
260
|
+
const element = this._elements.get(oldKey);
|
|
261
|
+
element.name = newName;
|
|
262
|
+
this._elements.delete(oldKey);
|
|
263
|
+
this._elements.set(newName.toLowerCase(), element);
|
|
264
|
+
}
|
|
265
|
+
// Rebuild edges replacing all occurrences of oldName
|
|
266
|
+
const newEdges = new Map();
|
|
267
|
+
for (const [parent, children] of this._edges) {
|
|
268
|
+
const newParent = (0, Utils_1.lowerAndDropSpaces)(parent) === normalizedOld ? newName : parent;
|
|
269
|
+
const newChildren = new Map();
|
|
270
|
+
for (const [child, weight] of children) {
|
|
271
|
+
const newChild = (0, Utils_1.lowerAndDropSpaces)(child) === normalizedOld ? newName : child;
|
|
272
|
+
newChildren.set(newChild, weight);
|
|
273
|
+
}
|
|
274
|
+
newEdges.set(newParent, newChildren);
|
|
275
|
+
}
|
|
276
|
+
this._edges = newEdges;
|
|
277
|
+
}
|
|
278
|
+
addComponent(parent, component, weight = 1) {
|
|
279
|
+
const parentElement = this.getElement(parent);
|
|
280
|
+
if (!parentElement) {
|
|
281
|
+
throw new Error(`Parent element '${parent}' not found in hierarchy`);
|
|
282
|
+
}
|
|
283
|
+
if (parentElement.elementType === Element_1.ElementType.STRING) {
|
|
284
|
+
throw new Error(`Parent element '${parent}' is of type String and cannot have components`);
|
|
285
|
+
}
|
|
286
|
+
this.addEdge(parent, component, weight);
|
|
287
|
+
}
|
|
157
288
|
*[Symbol.iterator]() {
|
|
158
289
|
yield* this._elements.values();
|
|
159
290
|
}
|
package/lib/objects/MDXView.d.ts
CHANGED
|
@@ -5,11 +5,14 @@ export declare class MDXView extends View {
|
|
|
5
5
|
* IMPORTANT. MDXViews can't be seen through the old TM1 clients (Archict, Perspectives). They do exist though!
|
|
6
6
|
*/
|
|
7
7
|
private _mdx;
|
|
8
|
-
|
|
8
|
+
private _dynamicProperties;
|
|
9
|
+
constructor(cubeName: string, viewName: string, MDX: string, dynamicProperties?: Record<string, any>);
|
|
9
10
|
get mdx(): string;
|
|
10
11
|
set mdx(value: string);
|
|
11
12
|
get MDX(): string;
|
|
12
13
|
set MDX(value: string);
|
|
14
|
+
get dynamicProperties(): Record<string, any>;
|
|
15
|
+
set dynamicProperties(value: Record<string, any>);
|
|
13
16
|
get body(): string;
|
|
14
17
|
substituteTitle(dimension: string, hierarchy: string, element: string): void;
|
|
15
18
|
static fromJSON(viewAsJson: string, cubeName?: string): MDXView;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MDXView.d.ts","sourceRoot":"","sources":["../../src/objects/MDXView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,qBAAa,OAAQ,SAAQ,IAAI;IAC7B;;;OAGG;IAEH,OAAO,CAAC,IAAI,CAAS;
|
|
1
|
+
{"version":3,"file":"MDXView.d.ts","sourceRoot":"","sources":["../../src/objects/MDXView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,qBAAa,OAAQ,SAAQ,IAAI;IAC7B;;;OAGG;IAEH,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,kBAAkB,CAAsB;gBAEpC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAMpG,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,IAAW,GAAG,CAAC,KAAK,EAAE,MAAM,EAE3B;IAED,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,IAAW,GAAG,CAAC,KAAK,EAAE,MAAM,EAE3B;IAED,IAAW,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAElD;IAED,IAAW,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAEtD;IAED,IAAW,IAAI,IAAI,MAAM,CAExB;IAEM,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;WAkCrE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;WAKxD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IASnE,OAAO,CAAC,aAAa;CAUxB"}
|
package/lib/objects/MDXView.js
CHANGED
|
@@ -4,9 +4,10 @@ exports.MDXView = void 0;
|
|
|
4
4
|
const View_1 = require("./View");
|
|
5
5
|
const Utils_1 = require("../utils/Utils");
|
|
6
6
|
class MDXView extends View_1.View {
|
|
7
|
-
constructor(cubeName, viewName, MDX) {
|
|
7
|
+
constructor(cubeName, viewName, MDX, dynamicProperties) {
|
|
8
8
|
super(cubeName, viewName);
|
|
9
9
|
this._mdx = MDX;
|
|
10
|
+
this._dynamicProperties = dynamicProperties || {};
|
|
10
11
|
}
|
|
11
12
|
get mdx() {
|
|
12
13
|
return this._mdx;
|
|
@@ -20,6 +21,12 @@ class MDXView extends View_1.View {
|
|
|
20
21
|
set MDX(value) {
|
|
21
22
|
this._mdx = value;
|
|
22
23
|
}
|
|
24
|
+
get dynamicProperties() {
|
|
25
|
+
return this._dynamicProperties;
|
|
26
|
+
}
|
|
27
|
+
set dynamicProperties(value) {
|
|
28
|
+
this._dynamicProperties = value;
|
|
29
|
+
}
|
|
23
30
|
get body() {
|
|
24
31
|
return this.constructBody();
|
|
25
32
|
}
|
|
@@ -53,13 +60,16 @@ class MDXView extends View_1.View {
|
|
|
53
60
|
}
|
|
54
61
|
static fromDict(viewAsDict, cubeName) {
|
|
55
62
|
var _a;
|
|
56
|
-
return new MDXView(((_a = viewAsDict.Cube) === null || _a === void 0 ? void 0 : _a.Name) || cubeName, viewAsDict.Name, viewAsDict.MDX);
|
|
63
|
+
return new MDXView(((_a = viewAsDict.Cube) === null || _a === void 0 ? void 0 : _a.Name) || cubeName, viewAsDict.Name, viewAsDict.MDX, viewAsDict.Properties || {});
|
|
57
64
|
}
|
|
58
65
|
constructBody() {
|
|
59
66
|
const mdxViewAsDict = {};
|
|
60
67
|
mdxViewAsDict['@odata.type'] = 'ibm.tm1.api.v1.MDXView';
|
|
61
68
|
mdxViewAsDict['Name'] = this._name;
|
|
62
69
|
mdxViewAsDict['MDX'] = this._mdx;
|
|
70
|
+
if (Object.keys(this._dynamicProperties).length > 0) {
|
|
71
|
+
mdxViewAsDict['Properties'] = this._dynamicProperties;
|
|
72
|
+
}
|
|
63
73
|
return JSON.stringify(mdxViewAsDict);
|
|
64
74
|
}
|
|
65
75
|
}
|
|
@@ -24,6 +24,8 @@ export declare class NativeView extends View {
|
|
|
24
24
|
set suppressEmptyColumns(value: boolean);
|
|
25
25
|
get suppressEmptyRows(): boolean;
|
|
26
26
|
set suppressEmptyRows(value: boolean);
|
|
27
|
+
get suppressEmptyCells(): boolean;
|
|
28
|
+
set suppressEmptyCells(value: boolean);
|
|
27
29
|
get formatString(): string;
|
|
28
30
|
set formatString(value: string);
|
|
29
31
|
addTitle(title: ViewTitleSelection): void;
|
|
@@ -32,6 +34,7 @@ export declare class NativeView extends View {
|
|
|
32
34
|
removeTitle(dimensionName: string): boolean;
|
|
33
35
|
removeColumn(dimensionName: string): boolean;
|
|
34
36
|
removeRow(dimensionName: string): boolean;
|
|
37
|
+
substituteTitle(dimension: string, element: string): void;
|
|
35
38
|
static fromJSON(viewAsJson: string, cubeName: string): NativeView;
|
|
36
39
|
static fromDict(viewAsDict: any, cubeName: string): NativeView;
|
|
37
40
|
private constructBody;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeView.d.ts","sourceRoot":"","sources":["../../src/objects/NativeView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAI/D,qBAAa,UAAW,SAAQ,IAAI;IAChC;;;;OAIG;IAEH,OAAO,CAAC,qBAAqB,CAAU;IACvC,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,KAAK,CAAsB;gBAG/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,oBAAoB,GAAE,OAAe,EACrC,iBAAiB,GAAE,OAAe,EAClC,YAAY,GAAE,MAAsB,EACpC,MAAM,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACrC,OAAO,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACrC,IAAI,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC;IAWtC,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,IAAI,IAAI,iBAAiB,EAAE,CAErC;IAED,IAAW,OAAO,IAAI,iBAAiB,EAAE,CAExC;IAED,IAAW,MAAM,IAAI,kBAAkB,EAAE,CAExC;IAED,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,IAAW,KAAK,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"NativeView.d.ts","sourceRoot":"","sources":["../../src/objects/NativeView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAI/D,qBAAa,UAAW,SAAQ,IAAI;IAChC;;;;OAIG;IAEH,OAAO,CAAC,qBAAqB,CAAU;IACvC,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,KAAK,CAAsB;gBAG/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,oBAAoB,GAAE,OAAe,EACrC,iBAAiB,GAAE,OAAe,EAClC,YAAY,GAAE,MAAsB,EACpC,MAAM,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACrC,OAAO,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACrC,IAAI,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC;IAWtC,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,IAAI,IAAI,iBAAiB,EAAE,CAErC;IAED,IAAW,OAAO,IAAI,iBAAiB,EAAE,CAExC;IAED,IAAW,MAAM,IAAI,kBAAkB,EAAE,CAExC;IAED,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,IAAW,KAAK,IAAI,MAAM,CAwDzB;IAED,IAAW,oBAAoB,IAAI,OAAO,CAEzC;IAED,IAAW,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAE7C;IAED,IAAW,iBAAiB,IAAI,OAAO,CAEtC;IAED,IAAW,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAE1C;IAED,IAAW,kBAAkB,IAAI,OAAO,CAEvC;IAED,IAAW,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAG3C;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,YAAY,CAAC,KAAK,EAAE,MAAM,EAEpC;IAEM,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAIzC,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI1C,MAAM,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI;IAIpC,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAU3C,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAU5C,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAUzC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;WAelD,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU;WAK1D,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU;IAoCrE,OAAO,CAAC,aAAa;CAmBxB"}
|
|
@@ -36,7 +36,7 @@ class NativeView extends View_1.View {
|
|
|
36
36
|
get asMDX() {
|
|
37
37
|
/** Build a valid MDX Query from an Existing cubeview.
|
|
38
38
|
* Takes Zero suppression into account.
|
|
39
|
-
* Throws an Exception when no elements are
|
|
39
|
+
* Throws an Exception when no elements are placed on the columns.
|
|
40
40
|
* Subsets are referenced in the result-MDX through the TM1SubsetToSet Function
|
|
41
41
|
*
|
|
42
42
|
* :return: String, the MDX Query
|
|
@@ -44,63 +44,38 @@ class NativeView extends View_1.View {
|
|
|
44
44
|
if (!this.columns || this.columns.length === 0) {
|
|
45
45
|
throw new Error("Column selection must not be empty");
|
|
46
46
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
for (const columnSelection of this.columns) {
|
|
52
|
-
const subset = columnSelection.subset;
|
|
53
|
-
if (subset instanceof Subset_1.AnonymousSubset) {
|
|
54
|
-
if (subset.expression) {
|
|
55
|
-
columnSets.push(subset.expression);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
const members = subset.elements.map(e => `[${subset.dimensionName}].[${e}]`);
|
|
59
|
-
columnSets.push(`{${members.join(', ')}}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
columnSets.push(`TM1SubsetToSet([${subset.dimensionName}], "${subset.name}")`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
if (this._suppressEmptyColumns) {
|
|
67
|
-
mdx += `NON EMPTY (${columnSets.join(' * ')}) ON COLUMNS`;
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
mdx += `(${columnSets.join(' * ')}) ON COLUMNS`;
|
|
71
|
-
}
|
|
72
|
-
// Build row axis if exists
|
|
73
|
-
if (this.rows && this.rows.length > 0) {
|
|
74
|
-
const rowSets = [];
|
|
75
|
-
for (const rowSelection of this.rows) {
|
|
76
|
-
const subset = rowSelection.subset;
|
|
47
|
+
const buildAxisMdx = (selections, axisOrdinal, suppress) => {
|
|
48
|
+
const sets = [];
|
|
49
|
+
for (const sel of selections) {
|
|
50
|
+
const subset = sel.subset;
|
|
77
51
|
if (subset instanceof Subset_1.AnonymousSubset) {
|
|
78
52
|
if (subset.expression) {
|
|
79
|
-
|
|
53
|
+
sets.push(subset.expression);
|
|
80
54
|
}
|
|
81
55
|
else {
|
|
82
|
-
const members = subset.elements.map(e => `[${subset.dimensionName}].[${e}]`);
|
|
83
|
-
|
|
56
|
+
const members = subset.elements.map(e => `[${subset.dimensionName}].[${subset.hierarchyName}].[${e}]`);
|
|
57
|
+
sets.push(`{${members.join(', ')}}`);
|
|
84
58
|
}
|
|
85
59
|
}
|
|
86
60
|
else {
|
|
87
|
-
|
|
61
|
+
sets.push(`TM1SubsetToSet([${subset.dimensionName}].[${subset.hierarchyName}], "${subset.name}")`);
|
|
88
62
|
}
|
|
89
63
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
64
|
+
const combined = sets.join(' * ');
|
|
65
|
+
const prefix = suppress ? 'NON EMPTY ' : '';
|
|
66
|
+
return `${prefix}{${combined}} DIMENSION PROPERTIES MEMBER_NAME ON ${axisOrdinal}`;
|
|
67
|
+
};
|
|
68
|
+
const axisParts = [];
|
|
69
|
+
axisParts.push(buildAxisMdx(this.columns, 0, this._suppressEmptyColumns));
|
|
70
|
+
if (this.rows && this.rows.length > 0) {
|
|
71
|
+
axisParts.push(buildAxisMdx(this.rows, 1, this._suppressEmptyRows));
|
|
96
72
|
}
|
|
97
|
-
mdx
|
|
98
|
-
// Add WHERE clause for titles
|
|
73
|
+
let mdx = `SELECT ${axisParts.join(',\n')} FROM [${this.cube}]`;
|
|
99
74
|
if (this.titles && this.titles.length > 0) {
|
|
100
75
|
const titleSelections = [];
|
|
101
76
|
for (const title of this.titles) {
|
|
102
|
-
if (title.selected
|
|
103
|
-
titleSelections.push(`[${title.dimensionName}].[${title.selected
|
|
77
|
+
if (title.selected) {
|
|
78
|
+
titleSelections.push(`[${title.dimensionName}].[${title.hierarchyName}].[${title.selected}]`);
|
|
104
79
|
}
|
|
105
80
|
}
|
|
106
81
|
if (titleSelections.length > 0) {
|
|
@@ -121,6 +96,13 @@ class NativeView extends View_1.View {
|
|
|
121
96
|
set suppressEmptyRows(value) {
|
|
122
97
|
this._suppressEmptyRows = value;
|
|
123
98
|
}
|
|
99
|
+
get suppressEmptyCells() {
|
|
100
|
+
return this._suppressEmptyColumns && this._suppressEmptyRows;
|
|
101
|
+
}
|
|
102
|
+
set suppressEmptyCells(value) {
|
|
103
|
+
this._suppressEmptyColumns = value;
|
|
104
|
+
this._suppressEmptyRows = value;
|
|
105
|
+
}
|
|
124
106
|
get formatString() {
|
|
125
107
|
return this._formatString;
|
|
126
108
|
}
|
|
@@ -160,6 +142,20 @@ class NativeView extends View_1.View {
|
|
|
160
142
|
}
|
|
161
143
|
return false;
|
|
162
144
|
}
|
|
145
|
+
substituteTitle(dimension, element) {
|
|
146
|
+
/** Substitute the title element for a given dimension
|
|
147
|
+
*
|
|
148
|
+
* :param dimension: str, name of dimension
|
|
149
|
+
* :param element: str, name of element
|
|
150
|
+
*/
|
|
151
|
+
for (const title of this._titles) {
|
|
152
|
+
if ((0, Utils_1.caseAndSpaceInsensitiveEquals)(title.dimensionName, dimension)) {
|
|
153
|
+
title.selected = element;
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
throw new Error(`No title with dimension: '${dimension}'`);
|
|
158
|
+
}
|
|
163
159
|
static fromJSON(viewAsJson, cubeName) {
|
|
164
160
|
const viewAsDict = JSON.parse(viewAsJson);
|
|
165
161
|
return NativeView.fromDict(viewAsDict, cubeName);
|