@sisense/sdk-data 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/cjs/dimensional-model/analytics/factory.d.ts +47 -0
  2. package/dist/cjs/dimensional-model/analytics/factory.js +151 -0
  3. package/dist/cjs/dimensional-model/analytics/factory.test.d.ts +1 -0
  4. package/dist/cjs/dimensional-model/analytics/factory.test.js +99 -0
  5. package/dist/cjs/dimensional-model/attributes.d.ts +139 -0
  6. package/dist/cjs/dimensional-model/attributes.js +342 -0
  7. package/dist/cjs/dimensional-model/attributes.test.d.ts +1 -0
  8. package/dist/cjs/dimensional-model/attributes.test.js +154 -0
  9. package/dist/cjs/dimensional-model/base.d.ts +43 -0
  10. package/dist/cjs/dimensional-model/base.js +58 -0
  11. package/dist/cjs/dimensional-model/base.test.d.ts +1 -0
  12. package/dist/cjs/dimensional-model/base.test.js +17 -0
  13. package/dist/cjs/dimensional-model/data-model.d.ts +13 -0
  14. package/dist/cjs/dimensional-model/data-model.js +37 -0
  15. package/dist/cjs/dimensional-model/dimensions.d.ts +167 -0
  16. package/dist/cjs/dimensional-model/dimensions.js +307 -0
  17. package/dist/cjs/dimensional-model/dimensions.test.d.ts +1 -0
  18. package/dist/cjs/dimensional-model/dimensions.test.js +54 -0
  19. package/dist/cjs/dimensional-model/factory.d.ts +17 -0
  20. package/dist/cjs/dimensional-model/factory.js +54 -0
  21. package/dist/cjs/dimensional-model/filters/factory.d.ts +796 -0
  22. package/dist/cjs/dimensional-model/filters/factory.js +962 -0
  23. package/dist/cjs/dimensional-model/filters/factory.test.d.ts +1 -0
  24. package/dist/cjs/dimensional-model/filters/factory.test.js +366 -0
  25. package/dist/cjs/dimensional-model/filters/filters.d.ts +321 -0
  26. package/dist/cjs/dimensional-model/filters/filters.js +614 -0
  27. package/dist/cjs/dimensional-model/filters/filters.test.d.ts +1 -0
  28. package/dist/cjs/dimensional-model/filters/filters.test.js +225 -0
  29. package/dist/cjs/dimensional-model/filters/utils/attribute-measure-util.d.ts +47 -0
  30. package/dist/cjs/dimensional-model/filters/utils/attribute-measure-util.js +111 -0
  31. package/dist/cjs/dimensional-model/filters/utils/condition-filter-util.d.ts +21 -0
  32. package/dist/cjs/dimensional-model/filters/utils/condition-filter-util.js +194 -0
  33. package/dist/cjs/dimensional-model/filters/utils/date-time-filter-util.d.ts +2 -0
  34. package/dist/cjs/dimensional-model/filters/utils/date-time-filter-util.js +12 -0
  35. package/dist/cjs/dimensional-model/filters/utils/filter-code-util.d.ts +13 -0
  36. package/dist/cjs/dimensional-model/filters/utils/filter-code-util.js +54 -0
  37. package/dist/cjs/dimensional-model/filters/utils/filter-code-util.test.d.ts +1 -0
  38. package/dist/cjs/dimensional-model/filters/utils/filter-code-util.test.js +32 -0
  39. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +73 -0
  40. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.js +190 -0
  41. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.test.d.ts +1 -0
  42. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.test.js +558 -0
  43. package/dist/cjs/dimensional-model/filters/utils/filter-matcher-utils.d.ts +5 -0
  44. package/dist/cjs/dimensional-model/filters/utils/filter-matcher-utils.js +174 -0
  45. package/dist/cjs/dimensional-model/filters/utils/filter-matcher-utils.test.d.ts +1 -0
  46. package/dist/cjs/dimensional-model/filters/utils/filter-matcher-utils.test.js +236 -0
  47. package/dist/cjs/dimensional-model/filters/utils/filter-types-util.d.ts +17 -0
  48. package/dist/cjs/dimensional-model/filters/utils/filter-types-util.js +79 -0
  49. package/dist/cjs/dimensional-model/filters/utils/types.d.ts +200 -0
  50. package/dist/cjs/dimensional-model/filters/utils/types.js +99 -0
  51. package/dist/cjs/dimensional-model/interfaces.d.ts +512 -0
  52. package/dist/cjs/dimensional-model/interfaces.js +31 -0
  53. package/dist/cjs/dimensional-model/measures/factory.d.ts +920 -0
  54. package/dist/cjs/dimensional-model/measures/factory.js +1188 -0
  55. package/dist/cjs/dimensional-model/measures/factory.test.d.ts +1 -0
  56. package/dist/cjs/dimensional-model/measures/factory.test.js +481 -0
  57. package/dist/cjs/dimensional-model/measures/measures.d.ts +217 -0
  58. package/dist/cjs/dimensional-model/measures/measures.js +416 -0
  59. package/dist/cjs/dimensional-model/measures/measures.test.d.ts +1 -0
  60. package/dist/cjs/dimensional-model/measures/measures.test.js +79 -0
  61. package/dist/cjs/dimensional-model/simple-column-types.d.ts +39 -0
  62. package/dist/cjs/dimensional-model/simple-column-types.js +134 -0
  63. package/dist/cjs/dimensional-model/simple-column-types.test.d.ts +1 -0
  64. package/dist/cjs/dimensional-model/simple-column-types.test.js +85 -0
  65. package/dist/cjs/dimensional-model/types.d.ts +256 -0
  66. package/dist/cjs/dimensional-model/types.js +298 -0
  67. package/dist/cjs/dimensional-model/types.test.d.ts +1 -0
  68. package/dist/cjs/dimensional-model/types.test.js +33 -0
  69. package/dist/cjs/index.d.ts +93 -0
  70. package/dist/cjs/index.js +123 -0
  71. package/dist/cjs/interfaces.d.ts +367 -0
  72. package/dist/cjs/interfaces.js +21 -0
  73. package/dist/cjs/translation/initialize-i18n.d.ts +2 -0
  74. package/dist/cjs/translation/initialize-i18n.js +14 -0
  75. package/dist/cjs/translation/resources/en.d.ts +28 -0
  76. package/dist/cjs/translation/resources/en.js +30 -0
  77. package/dist/cjs/translation/resources/index.d.ts +53 -0
  78. package/dist/cjs/translation/resources/index.js +10 -0
  79. package/dist/cjs/translation/resources/uk.d.ts +5 -0
  80. package/dist/cjs/translation/resources/uk.js +30 -0
  81. package/dist/cjs/translation/translatable-error.d.ts +5 -0
  82. package/dist/cjs/translation/translatable-error.js +15 -0
  83. package/dist/cjs/utils.d.ts +37 -0
  84. package/dist/cjs/utils.js +105 -0
  85. package/dist/cjs/utils.test.d.ts +1 -0
  86. package/dist/cjs/utils.test.js +158 -0
  87. package/dist/dimensional-model/filters/factory.d.ts +80 -42
  88. package/dist/dimensional-model/filters/factory.js +123 -85
  89. package/dist/dimensional-model/filters/filters.d.ts +34 -12
  90. package/dist/dimensional-model/filters/filters.js +69 -27
  91. package/dist/dimensional-model/filters/utils/condition-filter-util.d.ts +4 -2
  92. package/dist/dimensional-model/filters/utils/condition-filter-util.js +27 -25
  93. package/dist/dimensional-model/filters/utils/filter-code-util.js +1 -1
  94. package/dist/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +16 -10
  95. package/dist/dimensional-model/filters/utils/filter-from-jaql-util.js +34 -27
  96. package/package.json +18 -9
@@ -0,0 +1,481 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ /* eslint-disable vitest/expect-expect */
27
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
28
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
29
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
30
+ /* eslint-disable @typescript-eslint/restrict-template-expressions */
31
+ /* eslint-disable max-params */
32
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
33
+ /* eslint-disable vitest/no-identical-title */
34
+ const attributes_js_1 = require("../attributes.js");
35
+ const measures_js_1 = require("./measures.js");
36
+ const dimensions_js_1 = require("../dimensions.js");
37
+ const types_js_1 = require("../types.js");
38
+ const base_js_1 = require("../base.js");
39
+ const filterFactory = __importStar(require("../filters/factory.js"));
40
+ const measureFactory = __importStar(require("./factory.js"));
41
+ const sampleAttribute = new attributes_js_1.DimensionalAttribute('Cost', '[Commerce.Cost]', 'numeric-attribute');
42
+ const sampleMeasureName = 'measure name';
43
+ const sampleMeasureFormat = '00.00';
44
+ const sampleMeasure1 = new measures_js_1.DimensionalBaseMeasure('measure 1', sampleAttribute, types_js_1.AggregationTypes.Sum);
45
+ const sampleMeasure2 = new measures_js_1.DimensionalBaseMeasure('measure 2', sampleAttribute, types_js_1.AggregationTypes.Average);
46
+ const getContextName = (target) => {
47
+ return `[${(0, base_js_1.normalizeName)(target.name)}]`;
48
+ };
49
+ const verifyMeasure = (m, expectedAggregationType) => {
50
+ expect(m).toBeInstanceOf(measures_js_1.DimensionalBaseMeasure);
51
+ expect(m).toHaveProperty('aggregation', expectedAggregationType);
52
+ expect(m).toHaveProperty('attribute', sampleAttribute);
53
+ expect(m).toHaveProperty('name', sampleMeasureName);
54
+ expect(m.getFormat()).toBe(sampleMeasureFormat);
55
+ };
56
+ const verifyCalculatedMeasure = (m, expectedExpression, expectedContext, expectedName) => {
57
+ expect(m).toBeInstanceOf(measures_js_1.DimensionalCalculatedMeasure);
58
+ expect(m).toHaveProperty('expression', expectedExpression);
59
+ expect(m).toHaveProperty('context', expectedContext);
60
+ expect(m).toHaveProperty('name', expectedName !== null && expectedName !== void 0 ? expectedName : sampleMeasureName);
61
+ };
62
+ describe('measureFactory', () => {
63
+ describe('constant', () => {
64
+ test('measureFactory.constant()', () => {
65
+ const m = measureFactory.constant(42);
66
+ verifyCalculatedMeasure(m, '42', {}, '42');
67
+ });
68
+ });
69
+ describe('aggregations', () => {
70
+ test('measureFactory.sum()', () => {
71
+ const m = measureFactory.sum(sampleAttribute, sampleMeasureName, sampleMeasureFormat);
72
+ verifyMeasure(m, types_js_1.AggregationTypes.Sum);
73
+ });
74
+ test('measureFactory.average()', () => {
75
+ const m = measureFactory.average(sampleAttribute, sampleMeasureName, sampleMeasureFormat);
76
+ verifyMeasure(m, types_js_1.AggregationTypes.Average);
77
+ });
78
+ test('measureFactory.min()', () => {
79
+ const m = measureFactory.min(sampleAttribute, sampleMeasureName, sampleMeasureFormat);
80
+ verifyMeasure(m, types_js_1.AggregationTypes.Min);
81
+ });
82
+ test('measureFactory.max()', () => {
83
+ const m = measureFactory.max(sampleAttribute, sampleMeasureName, sampleMeasureFormat);
84
+ verifyMeasure(m, types_js_1.AggregationTypes.Max);
85
+ });
86
+ test('measureFactory.max()', () => {
87
+ const m = measureFactory.max(sampleAttribute, sampleMeasureName, sampleMeasureFormat);
88
+ verifyMeasure(m, types_js_1.AggregationTypes.Max);
89
+ });
90
+ test('measureFactory.median()', () => {
91
+ const m = measureFactory.median(sampleAttribute, sampleMeasureName, sampleMeasureFormat);
92
+ verifyMeasure(m, types_js_1.AggregationTypes.Median);
93
+ });
94
+ test('measureFactory.count()', () => {
95
+ const m = measureFactory.count(sampleAttribute, sampleMeasureName, sampleMeasureFormat);
96
+ verifyMeasure(m, types_js_1.AggregationTypes.Count);
97
+ });
98
+ test('measureFactory.countDistinct()', () => {
99
+ const m = measureFactory.countDistinct(sampleAttribute, sampleMeasureName, sampleMeasureFormat);
100
+ verifyMeasure(m, types_js_1.AggregationTypes.CountDistinct);
101
+ });
102
+ });
103
+ describe('unary formula functions', () => {
104
+ const expectedContext = {
105
+ '[measure1]': sampleMeasure1,
106
+ };
107
+ test('measureFactory.yearToDateSum()', () => {
108
+ const m = measureFactory.yearToDateSum(sampleMeasure1, sampleMeasureName);
109
+ verifyCalculatedMeasure(m, 'YTDSum([measure1])', expectedContext);
110
+ });
111
+ test('measureFactory.quarterToDateSum()', () => {
112
+ const m = measureFactory.quarterToDateSum(sampleMeasure1, sampleMeasureName);
113
+ verifyCalculatedMeasure(m, 'QTDSum([measure1])', expectedContext);
114
+ });
115
+ test('measureFactory.monthToDateSum()', () => {
116
+ const m = measureFactory.monthToDateSum(sampleMeasure1, sampleMeasureName);
117
+ verifyCalculatedMeasure(m, 'MTDSum([measure1])', expectedContext);
118
+ });
119
+ test('measureFactory.weekToDateSum()', () => {
120
+ const m = measureFactory.weekToDateSum(sampleMeasure1, sampleMeasureName);
121
+ verifyCalculatedMeasure(m, 'WTDSum([measure1])', expectedContext);
122
+ });
123
+ test('measureFactory.runningSum()', () => {
124
+ const m = measureFactory.runningSum(sampleMeasure1, false, sampleMeasureName);
125
+ verifyCalculatedMeasure(m, 'RSum([measure1])', expectedContext);
126
+ });
127
+ test('measureFactory.growth()', () => {
128
+ const m = measureFactory.growth(sampleMeasure1, sampleMeasureName);
129
+ verifyCalculatedMeasure(m, 'growth([measure1])', expectedContext);
130
+ });
131
+ test('measureFactory.growthRate()', () => {
132
+ const m = measureFactory.growthRate(sampleMeasure1, sampleMeasureName);
133
+ verifyCalculatedMeasure(m, 'growthrate([measure1])', expectedContext);
134
+ });
135
+ test('measureFactory.growthPastWeek()', () => {
136
+ const m = measureFactory.growthPastWeek(sampleMeasure1, sampleMeasureName);
137
+ verifyCalculatedMeasure(m, 'growthpastweek([measure1])', expectedContext);
138
+ });
139
+ test('measureFactory.growthPastMonth()', () => {
140
+ const m = measureFactory.growthPastMonth(sampleMeasure1, sampleMeasureName);
141
+ verifyCalculatedMeasure(m, 'growthpastmonth([measure1])', expectedContext);
142
+ });
143
+ test('measureFactory.growthPastQuarter()', () => {
144
+ const m = measureFactory.growthPastQuarter(sampleMeasure1, sampleMeasureName);
145
+ verifyCalculatedMeasure(m, 'growthpastquarter([measure1])', expectedContext);
146
+ });
147
+ test('measureFactory.growthPastYear()', () => {
148
+ const m = measureFactory.growthPastYear(sampleMeasure1, sampleMeasureName);
149
+ verifyCalculatedMeasure(m, 'growthpastyear([measure1])', expectedContext);
150
+ });
151
+ test('measureFactory.difference()', () => {
152
+ const m = measureFactory.difference(sampleMeasure1, sampleMeasureName);
153
+ verifyCalculatedMeasure(m, 'diffpastperiod([measure1])', expectedContext);
154
+ });
155
+ test('measureFactory.diffPastWeek()', () => {
156
+ const m = measureFactory.diffPastWeek(sampleMeasure1, sampleMeasureName);
157
+ verifyCalculatedMeasure(m, 'diffpastweek([measure1])', expectedContext);
158
+ });
159
+ test('measureFactory.diffPastMonth()', () => {
160
+ const m = measureFactory.diffPastMonth(sampleMeasure1, sampleMeasureName);
161
+ verifyCalculatedMeasure(m, 'diffpastmonth([measure1])', expectedContext);
162
+ });
163
+ test('measureFactory.diffPastQuarter()', () => {
164
+ const m = measureFactory.diffPastQuarter(sampleMeasure1, sampleMeasureName);
165
+ verifyCalculatedMeasure(m, 'diffpastquarter([measure1])', expectedContext);
166
+ });
167
+ test('measureFactory.diffPastYear()', () => {
168
+ const m = measureFactory.diffPastYear(sampleMeasure1, sampleMeasureName);
169
+ verifyCalculatedMeasure(m, 'diffpastyear([measure1])', expectedContext);
170
+ });
171
+ test('measureFactory.pastDay()', () => {
172
+ const m = measureFactory.pastDay(sampleMeasure1, sampleMeasureName);
173
+ verifyCalculatedMeasure(m, 'pastday([measure1])', expectedContext);
174
+ });
175
+ test('measureFactory.pastWeek()', () => {
176
+ const m = measureFactory.pastWeek(sampleMeasure1, sampleMeasureName);
177
+ verifyCalculatedMeasure(m, 'pastweek([measure1])', expectedContext);
178
+ });
179
+ test('measureFactory.pastMonth()', () => {
180
+ const m = measureFactory.pastMonth(sampleMeasure1, sampleMeasureName);
181
+ verifyCalculatedMeasure(m, 'pastmonth([measure1])', expectedContext);
182
+ });
183
+ test('measureFactory.pastQuarter()', () => {
184
+ const m = measureFactory.pastQuarter(sampleMeasure1, sampleMeasureName);
185
+ verifyCalculatedMeasure(m, 'pastquarter([measure1])', expectedContext);
186
+ });
187
+ test('measureFactory.pastYear()', () => {
188
+ const m = measureFactory.pastYear(sampleMeasure1, sampleMeasureName);
189
+ verifyCalculatedMeasure(m, 'pastyear([measure1])', expectedContext);
190
+ });
191
+ test('measureFactory.contribution()', () => {
192
+ const m = measureFactory.contribution(sampleMeasure1, sampleMeasureName);
193
+ verifyCalculatedMeasure(m, 'contribution([measure1])', expectedContext);
194
+ });
195
+ });
196
+ describe('arithmetical formula functions', () => {
197
+ describe('operands: two measures', () => {
198
+ const expectedContext = {
199
+ '[measure1]': sampleMeasure1,
200
+ '[measure2]': sampleMeasure2,
201
+ };
202
+ test('measureFactory.add()', () => {
203
+ const m = measureFactory.add(sampleMeasure1, sampleMeasure2, sampleMeasureName, false);
204
+ verifyCalculatedMeasure(m, '[measure1]+[measure2]', expectedContext);
205
+ });
206
+ test('measureFactory.subtract()', () => {
207
+ const m = measureFactory.subtract(sampleMeasure1, sampleMeasure2, sampleMeasureName, false);
208
+ verifyCalculatedMeasure(m, '[measure1]-[measure2]', expectedContext);
209
+ });
210
+ test('measureFactory.multiply()', () => {
211
+ const m = measureFactory.multiply(sampleMeasure1, sampleMeasure2, sampleMeasureName, false);
212
+ verifyCalculatedMeasure(m, '[measure1]*[measure2]', expectedContext);
213
+ });
214
+ test('measureFactory.divide()', () => {
215
+ const m = measureFactory.divide(sampleMeasure1, sampleMeasure2, sampleMeasureName, false);
216
+ verifyCalculatedMeasure(m, '[measure1]/[measure2]', expectedContext);
217
+ });
218
+ });
219
+ describe('operands: measure and number', () => {
220
+ const expectedContext = {
221
+ '[measure1]': sampleMeasure1,
222
+ };
223
+ const numberOperand = 10;
224
+ test('measureFactory.add()', () => {
225
+ const m = measureFactory.add(sampleMeasure1, numberOperand, sampleMeasureName, true);
226
+ verifyCalculatedMeasure(m, `([measure1]+${numberOperand})`, expectedContext);
227
+ });
228
+ test('measureFactory.subtract()', () => {
229
+ const m = measureFactory.subtract(sampleMeasure1, numberOperand, sampleMeasureName, true);
230
+ verifyCalculatedMeasure(m, `([measure1]-${numberOperand})`, expectedContext);
231
+ });
232
+ test('measureFactory.multiply()', () => {
233
+ const m = measureFactory.multiply(sampleMeasure1, numberOperand, sampleMeasureName, true);
234
+ verifyCalculatedMeasure(m, `([measure1]*${numberOperand})`, expectedContext);
235
+ });
236
+ test('measureFactory.divide()', () => {
237
+ const m = measureFactory.divide(sampleMeasure1, numberOperand, sampleMeasureName, true);
238
+ verifyCalculatedMeasure(m, `([measure1]/${numberOperand})`, expectedContext);
239
+ });
240
+ });
241
+ });
242
+ describe('rank formula function', () => {
243
+ test('measureFactory.rank()', () => {
244
+ const groupByAttribute = new attributes_js_1.DimensionalAttribute('Age Range', '[Commerce.Age Range]');
245
+ const m = measureFactory.rank(sampleMeasure1, sampleMeasureName, measureFactory.RankingSortTypes.Descending, measureFactory.RankingTypes.Dense, [groupByAttribute]);
246
+ verifyCalculatedMeasure(m, 'rank([measure1],DESC,1223,[AgeRange])', {
247
+ '[measure1]': sampleMeasure1,
248
+ '[AgeRange]': groupByAttribute,
249
+ });
250
+ });
251
+ });
252
+ describe('measuredValue formula function', () => {
253
+ test('measureFactory.measuredValue()', () => {
254
+ const textDimension = (0, dimensions_js_1.createDimension)({
255
+ name: 'Age Range',
256
+ type: 'textdimension',
257
+ expression: '[Commerce.Age Range]',
258
+ });
259
+ const filter = filterFactory.equals(textDimension, '65+');
260
+ const m = measureFactory.measuredValue(sampleMeasure1, [filter], sampleMeasureName);
261
+ verifyCalculatedMeasure(m, `([measure1],${getContextName(filter)})`, {
262
+ '[measure1]': sampleMeasure1,
263
+ [getContextName(filter)]: filter,
264
+ });
265
+ });
266
+ });
267
+ describe('advanced analytics functions', () => {
268
+ test('measureFactory.trend() with no options', () => {
269
+ const m = measureFactory.sum(sampleAttribute);
270
+ const mTrend = measureFactory.trend(m);
271
+ expect(mTrend.jaql()).toStrictEqual({
272
+ jaql: {
273
+ title: 'sum Cost Trend',
274
+ formula: 'trend([sumCost])',
275
+ context: {
276
+ '[sumCost]': {
277
+ title: 'sum Cost',
278
+ dim: '[Commerce.Cost]',
279
+ datatype: 'numeric',
280
+ agg: 'sum',
281
+ },
282
+ },
283
+ },
284
+ });
285
+ });
286
+ test('measureFactory.trend() with modelType=advancedSmoothing', () => {
287
+ const m = measureFactory.sum(sampleAttribute);
288
+ const mTrend = measureFactory.trend(m, 'Trend', {
289
+ modelType: 'advancedSmoothing',
290
+ ignoreAnomalies: true,
291
+ });
292
+ expect(mTrend.jaql()).toStrictEqual({
293
+ jaql: {
294
+ context: {
295
+ '[sumCost]': {
296
+ agg: 'sum',
297
+ datatype: 'numeric',
298
+ dim: '[Commerce.Cost]',
299
+ title: 'sum Cost',
300
+ },
301
+ },
302
+ formula: 'trend([sumCost], "modelType=smooth","ignoreAnomalies=true")',
303
+ title: 'Trend',
304
+ },
305
+ });
306
+ });
307
+ test('measureFactory.trend() with modelType=localEstimates', () => {
308
+ const m = measureFactory.sum(sampleAttribute);
309
+ const mTrend = measureFactory.trend(m, 'Trend', {
310
+ modelType: 'localEstimates',
311
+ });
312
+ expect(mTrend.jaql()).toStrictEqual({
313
+ jaql: {
314
+ context: {
315
+ '[sumCost]': {
316
+ agg: 'sum',
317
+ datatype: 'numeric',
318
+ dim: '[Commerce.Cost]',
319
+ title: 'sum Cost',
320
+ },
321
+ },
322
+ formula: 'trend([sumCost], "modelType=local")',
323
+ title: 'Trend',
324
+ },
325
+ });
326
+ });
327
+ test('measureFactory.forecast() with no options', () => {
328
+ const m = measureFactory.sum(sampleAttribute);
329
+ const mTrend = measureFactory.forecast(m);
330
+ expect(mTrend.jaql()).toStrictEqual({
331
+ jaql: {
332
+ formula: 'forecast([sumCost], "forecastHorizon=3")',
333
+ title: 'sum Cost Forecast',
334
+ context: {
335
+ '[sumCost]': {
336
+ title: 'sum Cost',
337
+ dim: '[Commerce.Cost]',
338
+ datatype: 'numeric',
339
+ agg: 'sum',
340
+ },
341
+ },
342
+ },
343
+ });
344
+ });
345
+ test('measureFactory.forecast() with only modelType', () => {
346
+ const m = measureFactory.sum(sampleAttribute);
347
+ const mTrend = measureFactory.forecast(m, 'Forecast', {
348
+ modelType: 'holtWinters',
349
+ });
350
+ expect(mTrend.jaql()).toStrictEqual({
351
+ jaql: {
352
+ formula: 'forecast([sumCost], "forecastHorizon=3","modelType=holtWinters")',
353
+ title: 'Forecast',
354
+ context: {
355
+ '[sumCost]': {
356
+ title: 'sum Cost',
357
+ dim: '[Commerce.Cost]',
358
+ datatype: 'numeric',
359
+ agg: 'sum',
360
+ },
361
+ },
362
+ },
363
+ });
364
+ });
365
+ test('measureFactory.forecast() with all options', () => {
366
+ const m = measureFactory.sum(sampleAttribute);
367
+ const mTrend = measureFactory.forecast(m, 'Forecast', {
368
+ forecastHorizon: 6,
369
+ modelType: 'holtWinters',
370
+ startDate: new Date('2023-01-01'),
371
+ endDate: new Date('2023-06-01'),
372
+ confidenceInterval: 0.9,
373
+ lowerBound: 1000,
374
+ upperBound: 100000,
375
+ roundToInt: true,
376
+ });
377
+ expect(mTrend.jaql()).toStrictEqual({
378
+ jaql: {
379
+ formula: 'forecast([sumCost], "forecastHorizon=6","modelType=holtWinters","startDate=2023-01-01T00:00:00","endDate=2023-06-01T00:00:00","confidenceInterval=0.9","lowerBound=1000","upperBound=100000","roundToInt=true")',
380
+ title: 'Forecast',
381
+ context: {
382
+ '[sumCost]': {
383
+ title: 'sum Cost',
384
+ dim: '[Commerce.Cost]',
385
+ datatype: 'numeric',
386
+ agg: 'sum',
387
+ },
388
+ },
389
+ },
390
+ });
391
+ });
392
+ });
393
+ test('measureFactory.forecast() with ISO string dates', () => {
394
+ const m = measureFactory.sum(sampleAttribute);
395
+ const mTrend = measureFactory.forecast(m, 'Forecast', {
396
+ forecastHorizon: 6,
397
+ modelType: 'holtWinters',
398
+ startDate: '2023-01-01',
399
+ endDate: '2023-06-01',
400
+ confidenceInterval: 0.9,
401
+ lowerBound: 1000,
402
+ upperBound: 100000,
403
+ roundToInt: true,
404
+ });
405
+ expect(mTrend.jaql()).toStrictEqual({
406
+ jaql: {
407
+ formula: 'forecast([sumCost], "forecastHorizon=6","modelType=holtWinters","startDate=2023-01-01T00:00:00","endDate=2023-06-01T00:00:00","confidenceInterval=0.9","lowerBound=1000","upperBound=100000","roundToInt=true")',
408
+ title: 'Forecast',
409
+ context: {
410
+ '[sumCost]': {
411
+ title: 'sum Cost',
412
+ dim: '[Commerce.Cost]',
413
+ datatype: 'numeric',
414
+ agg: 'sum',
415
+ },
416
+ },
417
+ },
418
+ });
419
+ });
420
+ describe('measureFactory.customFormula()', () => {
421
+ test('with attribute and measure', () => {
422
+ const m = measureFactory.customFormula('Total Attribute', 'SUM([Attribute]) - [Average Measure]', {
423
+ Attribute: sampleAttribute,
424
+ 'Average Measure': sampleMeasure2,
425
+ });
426
+ expect(m.jaql()).toStrictEqual({
427
+ jaql: {
428
+ context: {
429
+ '[Attribute]': {
430
+ datatype: 'numeric',
431
+ dim: '[Commerce.Cost]',
432
+ title: 'Cost',
433
+ },
434
+ '[Average Measure]': {
435
+ agg: 'avg',
436
+ datatype: 'numeric',
437
+ dim: '[Commerce.Cost]',
438
+ title: 'measure 2',
439
+ },
440
+ },
441
+ formula: 'SUM([Attribute]) - [Average Measure]',
442
+ title: 'Total Attribute',
443
+ },
444
+ });
445
+ });
446
+ test('with nested formula', () => {
447
+ const nestedMeasure = measureFactory.customFormula('Total Attribute', 'SUM([Attribute]) - [Average Measure]', {
448
+ Attribute: sampleAttribute,
449
+ 'Average Measure': sampleMeasure2,
450
+ });
451
+ const m = measureFactory.customFormula('Nested formula', 'RANK([Nested], "ASC", "1224")', {
452
+ Nested: nestedMeasure,
453
+ });
454
+ expect(m.jaql()).toStrictEqual({
455
+ jaql: {
456
+ context: {
457
+ '[Nested]': {
458
+ context: {
459
+ '[Attribute]': {
460
+ datatype: 'numeric',
461
+ dim: '[Commerce.Cost]',
462
+ title: 'Cost',
463
+ },
464
+ '[Average Measure]': {
465
+ agg: 'avg',
466
+ datatype: 'numeric',
467
+ dim: '[Commerce.Cost]',
468
+ title: 'measure 2',
469
+ },
470
+ },
471
+ formula: 'SUM([Attribute]) - [Average Measure]',
472
+ title: 'Total Attribute',
473
+ },
474
+ },
475
+ formula: 'RANK([Nested], "ASC", "1224")',
476
+ title: 'Nested formula',
477
+ },
478
+ });
479
+ });
480
+ });
481
+ });