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.
Files changed (105) hide show
  1. package/jest.ci.config.js +2 -0
  2. package/lib/objects/Axis.d.ts +3 -2
  3. package/lib/objects/Axis.d.ts.map +1 -1
  4. package/lib/objects/Axis.js +49 -8
  5. package/lib/objects/ElementAttribute.d.ts.map +1 -1
  6. package/lib/objects/ElementAttribute.js +3 -2
  7. package/lib/objects/Hierarchy.d.ts +9 -2
  8. package/lib/objects/Hierarchy.d.ts.map +1 -1
  9. package/lib/objects/Hierarchy.js +147 -16
  10. package/lib/objects/MDXView.d.ts +4 -1
  11. package/lib/objects/MDXView.d.ts.map +1 -1
  12. package/lib/objects/MDXView.js +12 -2
  13. package/lib/objects/NativeView.d.ts +3 -0
  14. package/lib/objects/NativeView.d.ts.map +1 -1
  15. package/lib/objects/NativeView.js +41 -45
  16. package/lib/services/ApplicationService.js +3 -3
  17. package/lib/services/CellService.d.ts +18 -16
  18. package/lib/services/CellService.d.ts.map +1 -1
  19. package/lib/services/CellService.js +72 -45
  20. package/lib/services/CubeService.d.ts +3 -6
  21. package/lib/services/CubeService.d.ts.map +1 -1
  22. package/lib/services/CubeService.js +83 -90
  23. package/lib/services/ElementService.d.ts +13 -14
  24. package/lib/services/ElementService.d.ts.map +1 -1
  25. package/lib/services/ElementService.js +80 -104
  26. package/lib/services/FileService.d.ts.map +1 -1
  27. package/lib/services/FileService.js +9 -0
  28. package/lib/services/HierarchyService.d.ts +2 -12
  29. package/lib/services/HierarchyService.d.ts.map +1 -1
  30. package/lib/services/HierarchyService.js +59 -153
  31. package/lib/services/MessageLogService.js +3 -3
  32. package/lib/services/ProcessService.d.ts +58 -15
  33. package/lib/services/ProcessService.d.ts.map +1 -1
  34. package/lib/services/ProcessService.js +268 -175
  35. package/lib/services/SecurityService.d.ts +2 -2
  36. package/lib/services/SecurityService.d.ts.map +1 -1
  37. package/lib/services/SecurityService.js +18 -12
  38. package/lib/services/ServerService.d.ts +2 -2
  39. package/lib/services/ServerService.d.ts.map +1 -1
  40. package/lib/services/SessionService.js +1 -1
  41. package/lib/services/SubsetService.d.ts.map +1 -1
  42. package/lib/services/SubsetService.js +4 -4
  43. package/lib/services/ViewService.js +2 -2
  44. package/lib/tests/bugfix28.test.d.ts +10 -0
  45. package/lib/tests/bugfix28.test.d.ts.map +1 -0
  46. package/lib/tests/bugfix28.test.js +178 -0
  47. package/lib/tests/cellService.test.js +91 -55
  48. package/lib/tests/comprehensive.service.test.js +14 -16
  49. package/lib/tests/cubeService.getAllNames.test.js +2 -2
  50. package/lib/tests/dimensionService.comprehensive.test.js +7 -7
  51. package/lib/tests/elementService.comprehensive.test.js +99 -82
  52. package/lib/tests/enhancedCellService.test.js +8 -8
  53. package/lib/tests/enhancedCubeService.test.js +79 -86
  54. package/lib/tests/enhancedElementService.test.js +22 -24
  55. package/lib/tests/hierarchyService.test.d.ts +1 -1
  56. package/lib/tests/hierarchyService.test.js +275 -206
  57. package/lib/tests/mdx.advanced.test.js +27 -83
  58. package/lib/tests/objectModelParity.test.d.ts +6 -0
  59. package/lib/tests/objectModelParity.test.d.ts.map +1 -0
  60. package/lib/tests/objectModelParity.test.js +511 -0
  61. package/lib/tests/processService.comprehensive.test.js +354 -142
  62. package/lib/tests/processService.test.js +15 -20
  63. package/lib/tests/security.advanced.test.js +5 -0
  64. package/lib/tests/securityService.comprehensive.test.js +50 -29
  65. package/lib/tests/simpleCoverage.test.js +11 -15
  66. package/lib/utils/Utils.d.ts +2 -0
  67. package/lib/utils/Utils.d.ts.map +1 -1
  68. package/lib/utils/Utils.js +11 -0
  69. package/package.json +1 -1
  70. package/src/objects/Axis.ts +55 -15
  71. package/src/objects/ElementAttribute.ts +3 -2
  72. package/src/objects/Hierarchy.ts +181 -35
  73. package/src/objects/MDXView.ts +17 -3
  74. package/src/objects/NativeView.ts +56 -53
  75. package/src/services/ApplicationService.ts +3 -3
  76. package/src/services/CellService.ts +101 -62
  77. package/src/services/CubeService.ts +99 -112
  78. package/src/services/ElementService.ts +120 -144
  79. package/src/services/FileService.ts +14 -0
  80. package/src/services/HierarchyService.ts +86 -192
  81. package/src/services/MessageLogService.ts +3 -3
  82. package/src/services/ProcessService.ts +365 -194
  83. package/src/services/SecurityService.ts +24 -16
  84. package/src/services/ServerService.ts +3 -3
  85. package/src/services/SessionService.ts +1 -1
  86. package/src/services/SubsetService.ts +4 -4
  87. package/src/services/ViewService.ts +2 -2
  88. package/src/tests/bugfix28.test.ts +236 -0
  89. package/src/tests/cellService.test.ts +138 -85
  90. package/src/tests/comprehensive.service.test.ts +23 -27
  91. package/src/tests/cubeService.getAllNames.test.ts +2 -2
  92. package/src/tests/dimensionService.comprehensive.test.ts +7 -7
  93. package/src/tests/elementService.comprehensive.test.ts +123 -106
  94. package/src/tests/enhancedCellService.test.ts +15 -14
  95. package/src/tests/enhancedCubeService.test.ts +100 -131
  96. package/src/tests/enhancedElementService.test.ts +26 -31
  97. package/src/tests/hierarchyService.test.ts +344 -243
  98. package/src/tests/mdx.advanced.test.ts +35 -89
  99. package/src/tests/objectModelParity.test.ts +574 -0
  100. package/src/tests/processService.comprehensive.test.ts +507 -193
  101. package/src/tests/processService.test.ts +23 -24
  102. package/src/tests/security.advanced.test.ts +6 -0
  103. package/src/tests/securityService.comprehensive.test.ts +81 -49
  104. package/src/tests/simpleCoverage.test.ts +14 -18
  105. 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
@@ -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(_data: Record<string, any>): ViewAxisSelection;
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(_data: Record<string, any>): ViewTitleSelection;
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,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,iBAAiB;IAKrE,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,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAE3C;WAEa,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,kBAAkB;IAKtE,OAAO,CAAC,aAAa;CA6BxB"}
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"}
@@ -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(_data) {
35
- // Basic implementation - would need actual data structure
36
- return new ViewAxisSelection('', new Subset_1.AnonymousSubset('', ''));
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(_data) {
81
- // Basic implementation - would need actual data structure
82
- return new ViewTitleSelection('', new Subset_1.AnonymousSubset('', ''), '');
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;AAExC,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"}
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.toLowerCase().replace(/\s+/g, '') ===
87
- other._name.toLowerCase().replace(/\s+/g, '');
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>, subsets?: string[], structure?: number, defaultMember?: string);
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,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,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,CAAkC;IAChD,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,MAAM,CAAC,EAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM;WAmBZ,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS;IA2B9E,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,MAAM,CAAC,CAEtC;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;IAef,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;IAK5E,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAK9D,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK5E,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;IAKlD,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC;IAI9C,IAAW,MAAM,IAAI,MAAM,CAE1B;CACJ"}
1
+ {"version":3,"file":"Hierarchy.d.ts","sourceRoot":"","sources":["../../src/objects/Hierarchy.ts"],"names":[],"mappings":"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"}
@@ -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 ? new Map(edges) : new Map();
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 key = `${edge.ParentName}:${edge.ComponentName}`;
37
- edges.set(key, edge.Weight || 1);
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 [key, weight] of this._edges) {
107
- const [parentName, componentName] = key.split(':');
108
- edges.push({
109
- ParentName: parentName,
110
- ComponentName: componentName,
111
- Weight: weight
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
- const key = `${parentName}:${componentName}`;
130
- this._edges.set(key, weight);
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 key = `${parentName}:${componentName}`;
134
- return this._edges.delete(key);
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
- const key = `${parentName}:${componentName}`;
138
- return this._edges.get(key);
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
  }
@@ -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
- constructor(cubeName: string, viewName: string, MDX: string);
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;gBAET,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAK3D,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,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;IAQnE,OAAO,CAAC,aAAa;CAOxB"}
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"}
@@ -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,CA6EzB;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,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;WAUlC,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"}
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 place on the columns.
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
- // Basic MDX construction - this would need a full MDX builder implementation
48
- let mdx = "SELECT ";
49
- // Build column axis
50
- const columnSets = [];
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
- rowSets.push(subset.expression);
53
+ sets.push(subset.expression);
80
54
  }
81
55
  else {
82
- const members = subset.elements.map(e => `[${subset.dimensionName}].[${e}]`);
83
- rowSets.push(`{${members.join(', ')}}`);
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
- rowSets.push(`TM1SubsetToSet([${subset.dimensionName}], "${subset.name}")`);
61
+ sets.push(`TM1SubsetToSet([${subset.dimensionName}].[${subset.hierarchyName}], "${subset.name}")`);
88
62
  }
89
63
  }
90
- if (this._suppressEmptyRows) {
91
- mdx += `, NON EMPTY (${rowSets.join(' * ')}) ON ROWS`;
92
- }
93
- else {
94
- mdx += `, (${rowSets.join(' * ')}) ON ROWS`;
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 += ` FROM [${this.cube}]`;
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 && title.selected.length > 0) {
103
- titleSelections.push(`[${title.dimensionName}].[${title.selected[0]}]`);
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);