@sisense/sdk-data 1.21.0 → 1.23.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 (58) hide show
  1. package/dist/cjs/dimensional-model/attributes.js +5 -5
  2. package/dist/cjs/dimensional-model/base.js +1 -1
  3. package/dist/cjs/dimensional-model/dimensions.d.ts +3 -3
  4. package/dist/cjs/dimensional-model/dimensions.js +29 -25
  5. package/dist/cjs/dimensional-model/filters/factory.d.ts +3 -1
  6. package/dist/cjs/dimensional-model/filters/factory.js +4 -2
  7. package/dist/cjs/dimensional-model/filters/filters.d.ts +3 -1
  8. package/dist/cjs/dimensional-model/filters/filters.js +3 -5
  9. package/dist/cjs/dimensional-model/filters/utils/attribute-measure-util.d.ts +1 -1
  10. package/dist/cjs/dimensional-model/filters/utils/attribute-measure-util.js +5 -4
  11. package/dist/cjs/dimensional-model/filters/utils/condition-filter-util.js +16 -7
  12. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +1 -1
  13. package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.js +7 -4
  14. package/dist/cjs/dimensional-model/interfaces.d.ts +1 -0
  15. package/dist/cjs/dimensional-model/jaql-element.d.ts +36 -0
  16. package/dist/cjs/dimensional-model/jaql-element.js +73 -0
  17. package/dist/cjs/dimensional-model/measures/factory.js +2 -1
  18. package/dist/cjs/dimensional-model/types.d.ts +148 -0
  19. package/dist/cjs/dimensional-model/types.js +11 -2
  20. package/dist/cjs/index.d.ts +2 -0
  21. package/dist/cjs/index.js +4 -1
  22. package/dist/cjs/translation/resources/en.d.ts +17 -0
  23. package/dist/cjs/translation/resources/en.js +3 -0
  24. package/dist/cjs/translation/resources/index.d.ts +12 -0
  25. package/dist/cjs/translation/resources/index.js +6 -0
  26. package/dist/cjs/translation/resources/uk.js +3 -0
  27. package/dist/cjs/utils.d.ts +11 -1
  28. package/dist/cjs/utils.js +28 -5
  29. package/dist/dimensional-model/attributes.js +5 -5
  30. package/dist/dimensional-model/base.js +1 -1
  31. package/dist/dimensional-model/dimensions.d.ts +3 -3
  32. package/dist/dimensional-model/dimensions.js +29 -25
  33. package/dist/dimensional-model/filters/factory.d.ts +3 -1
  34. package/dist/dimensional-model/filters/factory.js +4 -2
  35. package/dist/dimensional-model/filters/filters.d.ts +3 -1
  36. package/dist/dimensional-model/filters/filters.js +3 -5
  37. package/dist/dimensional-model/filters/utils/attribute-measure-util.d.ts +1 -1
  38. package/dist/dimensional-model/filters/utils/attribute-measure-util.js +5 -4
  39. package/dist/dimensional-model/filters/utils/condition-filter-util.js +16 -7
  40. package/dist/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +1 -1
  41. package/dist/dimensional-model/filters/utils/filter-from-jaql-util.js +7 -4
  42. package/dist/dimensional-model/interfaces.d.ts +1 -0
  43. package/dist/dimensional-model/jaql-element.d.ts +36 -0
  44. package/dist/dimensional-model/jaql-element.js +68 -0
  45. package/dist/dimensional-model/measures/factory.js +2 -1
  46. package/dist/dimensional-model/types.d.ts +148 -0
  47. package/dist/dimensional-model/types.js +10 -1
  48. package/dist/index.d.ts +2 -0
  49. package/dist/index.js +2 -0
  50. package/dist/translation/resources/en.d.ts +17 -0
  51. package/dist/translation/resources/en.js +3 -0
  52. package/dist/translation/resources/index.d.ts +12 -0
  53. package/dist/translation/resources/index.js +6 -0
  54. package/dist/translation/resources/uk.js +3 -0
  55. package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -1
  56. package/dist/utils.d.ts +11 -1
  57. package/dist/utils.js +24 -2
  58. package/package.json +3 -3
@@ -40,7 +40,7 @@ class DimensionalAttribute extends base_js_1.DimensionalElement {
40
40
  * @returns An instance representing the sorted {@link Attribute} of this instance
41
41
  */
42
42
  sort(sort) {
43
- return new DimensionalAttribute(this.name, this.expression, this.type, this.description, sort);
43
+ return new DimensionalAttribute(this.name, this.expression, this.type, this.description, sort, this.dataSource);
44
44
  }
45
45
  /**
46
46
  * Gets the JAQL representation of this instance
@@ -109,7 +109,7 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
109
109
  * @returns An instance representing the sorted {@link LevelAttribute} of this instance
110
110
  */
111
111
  sort(sort) {
112
- return new DimensionalLevelAttribute(this.name, this.expression, this.granularity, this._format, this.description, sort);
112
+ return new DimensionalLevelAttribute(this.name, this.expression, this.granularity, this._format, this.description, sort, this.dataSource);
113
113
  }
114
114
  /**
115
115
  * The string formatting of this instance
@@ -126,7 +126,7 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
126
126
  * @returns An instance representing the formatted {@link LevelAttribute} of this instance
127
127
  */
128
128
  format(format) {
129
- return new DimensionalLevelAttribute(this.name, this.expression, this.granularity, format, this.description, this._sort);
129
+ return new DimensionalLevelAttribute(this.name, this.expression, this.granularity, format, this.description, this._sort, this.dataSource);
130
130
  }
131
131
  /**
132
132
  * Gets a serializable representation of the element
@@ -326,7 +326,7 @@ function createAttribute(json) {
326
326
  if (json.granularity) {
327
327
  return createLevel(json);
328
328
  }
329
- return new DimensionalAttribute(json.name || json.title, json.attribute || json.expression || json.dim, json.type, json.desc || json.description);
329
+ return new DimensionalAttribute(json.name || json.title, json.attribute || json.expression || json.dim, json.type, json.desc || json.description, json.sort, json.dataSource);
330
330
  }
331
331
  exports.createAttribute = createAttribute;
332
332
  /**
@@ -336,7 +336,7 @@ exports.createAttribute = createAttribute;
336
336
  * @internal
337
337
  */
338
338
  function createLevel(json) {
339
- return new DimensionalLevelAttribute(json.name || json.title, json.attribute || json.expression || json.dim, json.granularity, json.format, json.desc || json.description);
339
+ return new DimensionalLevelAttribute(json.name || json.title, json.attribute || json.expression || json.dim, json.granularity, json.format, json.desc || json.description, json.sort, json.dataSource);
340
340
  }
341
341
  exports.createLevel = createLevel;
342
342
  /**
@@ -57,7 +57,7 @@ exports.DimensionalElement = DimensionalElement;
57
57
  */
58
58
  function normalizeName(name) {
59
59
  // Remove all invalid characters
60
- let normalizedName = name.replace(/[^a-zA-Z0-9_]/g, '');
60
+ let normalizedName = name.replace(/[^a-zA-Z0-9_.]/g, '').replace('.', '_');
61
61
  // Prefix with '_' if it starts with a number
62
62
  const firstChar = normalizedName.charAt(0);
63
63
  if (firstChar.match(/[0-9]/)) {
@@ -1,5 +1,5 @@
1
1
  import { Attribute, LevelAttribute, Dimension, DateDimension } from './interfaces.js';
2
- import { Sort } from './types.js';
2
+ import { Sort, JaqlDataSource } from './types.js';
3
3
  import { DimensionalElement } from './base.js';
4
4
  /**
5
5
  * Represents a Dimension in a Dimensional Model
@@ -14,7 +14,7 @@ export declare class DimensionalDimension extends DimensionalElement implements
14
14
  protected _attributes: Attribute[];
15
15
  private _expression;
16
16
  protected _sort: Sort;
17
- constructor(name: string, expression: string, attributes: Attribute[], dimensions?: Dimension[], type?: string, desc?: string, sort?: Sort);
17
+ constructor(name: string, expression: string, attributes: Attribute[], dimensions?: Dimension[], type?: string, desc?: string, sort?: Sort, dataSource?: JaqlDataSource);
18
18
  private getAttachedName;
19
19
  protected setDimensions(dimensions: Dimension[]): void;
20
20
  protected setAttributes(attributes: Attribute[]): void;
@@ -61,7 +61,7 @@ export declare class DimensionalDimension extends DimensionalElement implements
61
61
  * @internal
62
62
  */
63
63
  export declare class DimensionalDateDimension extends DimensionalDimension implements DateDimension {
64
- constructor(name: string, expression: string, desc?: string, sort?: Sort);
64
+ constructor(name: string, expression: string, desc?: string, sort?: Sort, dataSource?: JaqlDataSource);
65
65
  /**
66
66
  * Years level
67
67
  */
@@ -10,8 +10,8 @@ const base_js_1 = require("./base.js");
10
10
  * @internal
11
11
  */
12
12
  class DimensionalDimension extends base_js_1.DimensionalElement {
13
- constructor(name, expression, attributes, dimensions, type, desc, sort) {
14
- super(name, type || types_js_1.MetadataTypes.Dimension, desc);
13
+ constructor(name, expression, attributes, dimensions, type, desc, sort, dataSource) {
14
+ super(name, type || types_js_1.MetadataTypes.Dimension, desc, dataSource);
15
15
  this._dimensions = [];
16
16
  this._attributes = [];
17
17
  this._sort = types_js_1.Sort.None;
@@ -104,7 +104,7 @@ class DimensionalDimension extends base_js_1.DimensionalElement {
104
104
  * @returns An instance representing the sorted {@link Dimension} of this instance
105
105
  */
106
106
  sort(sort) {
107
- return new DimensionalDimension(this.name, this.expression, this.attributes, this.dimensions, this.type, this.description, sort);
107
+ return new DimensionalDimension(this.name, this.expression, this.attributes, this.dimensions, this.type, this.description, sort, this.dataSource);
108
108
  }
109
109
  /**
110
110
  * Gets a serializable representation of the element
@@ -154,23 +154,23 @@ exports.DimensionalDimension = DimensionalDimension;
154
154
  * @internal
155
155
  */
156
156
  class DimensionalDateDimension extends DimensionalDimension {
157
- constructor(name, expression, desc, sort) {
158
- super(name, expression, [], [], types_js_1.MetadataTypes.DateDimension, desc, sort);
157
+ constructor(name, expression, desc, sort, dataSource) {
158
+ super(name, expression, [], [], types_js_1.MetadataTypes.DateDimension, desc, sort, dataSource);
159
159
  this.defaultLevel = types_js_1.DateLevels.Years;
160
- this.Years = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Years, expression, types_js_1.DateLevels.Years, 'yyyy');
161
- this.Quarters = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Quarters, expression, types_js_1.DateLevels.Quarters, 'Q yyyy');
162
- this.Months = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Months, expression, types_js_1.DateLevels.Months, 'yyyy-MM');
163
- this.Weeks = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Weeks, expression, types_js_1.DateLevels.Weeks, 'ww yyyy');
164
- this.Days = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Days, expression, types_js_1.DateLevels.Days, 'yyyy-MM-dd');
165
- this.Hours = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Hours, expression, types_js_1.DateLevels.Hours, 'yyyy-MM-dd HH:mm');
166
- this.MinutesRoundTo30 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.MinutesRoundTo30, expression, types_js_1.DateLevels.MinutesRoundTo30, 'yyyy-MM-dd HH:mm');
167
- this.MinutesRoundTo15 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.MinutesRoundTo15, expression, types_js_1.DateLevels.MinutesRoundTo15, 'yyyy-MM-dd HH:mm');
168
- this.Minutes = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Minutes, expression, types_js_1.DateLevels.Minutes, 'yyyy-MM-dd HH:mm');
169
- this.Seconds = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Seconds, expression, types_js_1.DateLevels.Seconds, 'yyyy-MM-dd HH:mm:ss');
170
- this.AggHours = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggHours, expression, types_js_1.DateLevels.AggHours, 'HH:mm');
171
- this.AggMinutesRoundTo30 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggMinutesRoundTo30, expression, types_js_1.DateLevels.AggMinutesRoundTo30, 'HH:mm');
172
- this.AggMinutesRoundTo15 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggMinutesRoundTo15, expression, types_js_1.DateLevels.AggMinutesRoundTo15, 'HH:mm');
173
- this.AggMinutesRoundTo1 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggMinutesRoundTo1, expression, types_js_1.DateLevels.AggMinutesRoundTo1, 'HH:mm');
160
+ this.Years = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Years, expression, types_js_1.DateLevels.Years, 'yyyy', desc, sort, dataSource);
161
+ this.Quarters = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Quarters, expression, types_js_1.DateLevels.Quarters, 'Q yyyy', desc, sort, dataSource);
162
+ this.Months = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Months, expression, types_js_1.DateLevels.Months, 'yyyy-MM', desc, sort, dataSource);
163
+ this.Weeks = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Weeks, expression, types_js_1.DateLevels.Weeks, 'ww yyyy', desc, sort, dataSource);
164
+ this.Days = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Days, expression, types_js_1.DateLevels.Days, 'yyyy-MM-dd', desc, sort, dataSource);
165
+ this.Hours = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Hours, expression, types_js_1.DateLevels.Hours, 'yyyy-MM-dd HH:mm', desc, sort, dataSource);
166
+ this.MinutesRoundTo30 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.MinutesRoundTo30, expression, types_js_1.DateLevels.MinutesRoundTo30, 'yyyy-MM-dd HH:mm', desc, sort, dataSource);
167
+ this.MinutesRoundTo15 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.MinutesRoundTo15, expression, types_js_1.DateLevels.MinutesRoundTo15, 'yyyy-MM-dd HH:mm', desc, sort, dataSource);
168
+ this.Minutes = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Minutes, expression, types_js_1.DateLevels.Minutes, 'yyyy-MM-dd HH:mm', desc, sort, dataSource);
169
+ this.Seconds = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Seconds, expression, types_js_1.DateLevels.Seconds, 'yyyy-MM-dd HH:mm:ss', desc, sort, dataSource);
170
+ this.AggHours = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggHours, expression, types_js_1.DateLevels.AggHours, 'HH:mm', desc, sort, dataSource);
171
+ this.AggMinutesRoundTo30 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggMinutesRoundTo30, expression, types_js_1.DateLevels.AggMinutesRoundTo30, 'HH:mm', desc, sort, dataSource);
172
+ this.AggMinutesRoundTo15 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggMinutesRoundTo15, expression, types_js_1.DateLevels.AggMinutesRoundTo15, 'HH:mm', desc, sort, dataSource);
173
+ this.AggMinutesRoundTo1 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggMinutesRoundTo1, expression, types_js_1.DateLevels.AggMinutesRoundTo1, 'HH:mm', desc, sort, dataSource);
174
174
  this.setAttributes([
175
175
  this.Years,
176
176
  this.Quarters,
@@ -215,7 +215,7 @@ class DimensionalDateDimension extends DimensionalDimension {
215
215
  * @returns An instance representing the sorted {@link Dimension} of this instance
216
216
  */
217
217
  sort(sort) {
218
- return new DimensionalDateDimension(this.name, this.expression, this.description, sort);
218
+ return new DimensionalDateDimension(this.name, this.expression, this.description, sort, this.dataSource);
219
219
  }
220
220
  /**
221
221
  * Gets a serializable representation of the element
@@ -255,9 +255,11 @@ function createDimension(json) {
255
255
  const description = json.desc || json.description;
256
256
  const expression = json.expression || json.dim;
257
257
  const type = DimensionalDimension.parseType(json.dimtype || json.type);
258
+ const sort = json.sort;
259
+ const dataSource = json.dataSource;
258
260
  // date dimension
259
261
  if (type == types_js_1.MetadataTypes.DateDimension) {
260
- return new DimensionalDateDimension(name, expression, description);
262
+ return new DimensionalDateDimension(name, expression, description, sort, dataSource);
261
263
  }
262
264
  // attributes
263
265
  const atts = Object.getOwnPropertyNames(json)
@@ -268,12 +270,12 @@ function createDimension(json) {
268
270
  let att;
269
271
  for (let i = 0; i < json.attributes.length; i++) {
270
272
  att = json.attributes[i];
271
- atts.push(new attributes_js_1.DimensionalAttribute(att.name, att.expression, att.type, att.description));
273
+ atts.push(new attributes_js_1.DimensionalAttribute(att.name, att.expression, att.type, att.description, att.sort, att.dataSource));
272
274
  }
273
275
  }
274
276
  // default attribute
275
277
  else if (expression) {
276
- atts.push(new attributes_js_1.DimensionalAttribute(name, expression, type, description));
278
+ atts.push(new attributes_js_1.DimensionalAttribute(name, expression, type, description, sort, dataSource));
277
279
  }
278
280
  }
279
281
  // nested dimensions
@@ -285,7 +287,7 @@ function createDimension(json) {
285
287
  dims.push(createDimension(json.dimensions[i]));
286
288
  }
287
289
  }
288
- const d = new DimensionalDimension(name, expression, atts, dims, type, description);
290
+ const d = new DimensionalDimension(name, expression, atts, dims, type, description, sort, dataSource);
289
291
  if (json.defaultAttribute) {
290
292
  d.defaultAttribute = atts.find((a) => a.name === json.defaultAttribute);
291
293
  }
@@ -307,6 +309,8 @@ function createDateDimension(json) {
307
309
  const name = json.name || json.title;
308
310
  const expression = json.expression || json.dim;
309
311
  const description = json.desc || json.description;
310
- return new DimensionalDateDimension(name, expression, description);
312
+ const sort = json.sort;
313
+ const dataSource = json.dataSource;
314
+ return new DimensionalDateDimension(name, expression, description, sort, dataSource);
311
315
  }
312
316
  exports.createDateDimension = createDateDimension;
@@ -377,9 +377,11 @@ export declare function numeric(attribute: Attribute, operatorA?: string, valueA
377
377
  * @param guid - Optional GUID for the filter
378
378
  * @param deactivatedMembers - Array of deactivated member values
379
379
  * @param backgroundFilter - Optional background filter
380
+ * @param multiSelection - Optional flag to disable multi-selection
380
381
  * @returns A filter instance
382
+ * @shortDescription Creates filter on attribute to match certain string values
381
383
  */
382
- export declare function members(attribute: Attribute, members: string[], excludeMembers?: boolean, guid?: string, deactivatedMembers?: string[], backgroundFilter?: Filter): Filter;
384
+ export declare function members(attribute: Attribute, members: string[], excludeMembers?: boolean, guid?: string, deactivatedMembers?: string[], backgroundFilter?: Filter, multiSelection?: boolean): Filter;
383
385
  /**
384
386
  * Creates a filter to isolate date values starting from and including the given date and level.
385
387
  *
@@ -449,10 +449,12 @@ exports.numeric = numeric;
449
449
  * @param guid - Optional GUID for the filter
450
450
  * @param deactivatedMembers - Array of deactivated member values
451
451
  * @param backgroundFilter - Optional background filter
452
+ * @param multiSelection - Optional flag to disable multi-selection
452
453
  * @returns A filter instance
454
+ * @shortDescription Creates filter on attribute to match certain string values
453
455
  */
454
- function members(attribute, members, excludeMembers, guid, deactivatedMembers, backgroundFilter) {
455
- return new filters_js_1.MembersFilter(attribute, members, excludeMembers, guid, deactivatedMembers, backgroundFilter);
456
+ function members(attribute, members, excludeMembers, guid, deactivatedMembers, backgroundFilter, multiSelection) {
457
+ return new filters_js_1.MembersFilter(attribute, members, excludeMembers, guid, deactivatedMembers, backgroundFilter, multiSelection);
456
458
  }
457
459
  exports.members = members;
458
460
  // DATE FILTERS
@@ -166,10 +166,12 @@ export declare class MembersFilter extends AbstractFilter {
166
166
  /** @internal */
167
167
  excludeMembers: boolean;
168
168
  /** @internal */
169
+ multiSelection: boolean;
170
+ /** @internal */
169
171
  deactivatedMembers: any[];
170
172
  /** @internal */
171
173
  backgroundFilter?: Filter;
172
- constructor(attribute: Attribute, members?: any[], excludeMembers?: boolean, guid?: string, deactivatedMembers?: any[], backgroundFilter?: Filter);
174
+ constructor(attribute: Attribute, members?: any[], excludeMembers?: boolean, guid?: string, deactivatedMembers?: any[], backgroundFilter?: Filter, multiSelection?: boolean);
173
175
  /**
174
176
  * gets the element's ID
175
177
  */
@@ -227,10 +227,11 @@ exports.LogicalAttributeFilter = LogicalAttributeFilter;
227
227
  * @internal
228
228
  */
229
229
  class MembersFilter extends AbstractFilter {
230
- constructor(attribute, members, excludeMembers, guid, deactivatedMembers, backgroundFilter) {
230
+ constructor(attribute, members, excludeMembers, guid, deactivatedMembers, backgroundFilter, multiSelection = true) {
231
231
  super(attribute, exports.FilterTypes.members, guid);
232
232
  this.members = members !== null && members !== void 0 ? members : [];
233
233
  this.excludeMembers = excludeMembers !== null && excludeMembers !== void 0 ? excludeMembers : false;
234
+ this.multiSelection = multiSelection;
234
235
  this.deactivatedMembers = deactivatedMembers !== null && deactivatedMembers !== void 0 ? deactivatedMembers : [];
235
236
  this.backgroundFilter = backgroundFilter;
236
237
  if (this.members.filter((m) => m === null || m === undefined).length > 0) {
@@ -263,10 +264,7 @@ class MembersFilter extends AbstractFilter {
263
264
  const membersFilterJaql = {
264
265
  members: this.members.map((m) => m.toString()),
265
266
  };
266
- // if there's no members to exclude, do not add the exclude property
267
- const filterJaql = this.excludeMembers && this.members.length
268
- ? { exclude: membersFilterJaql }
269
- : membersFilterJaql;
267
+ const filterJaql = this.excludeMembers ? { exclude: membersFilterJaql } : membersFilterJaql;
270
268
  if (this.backgroundFilter) {
271
269
  return {
272
270
  and: [filterJaql, this.backgroundFilter.filterJaql()],
@@ -55,4 +55,4 @@ export declare const createMeasureFromFilterJaql: (jaql: FilterJaqlInternal) =>
55
55
  * @param jaql - Ranking filter Jaql object
56
56
  * @returns Measure
57
57
  */
58
- export declare const createMeasureFromRankingFilterJaql: (jaql: RankingFilterJaql | CustomFormulaJaql) => BaseMeasure | CalculatedMeasure;
58
+ export declare const createMeasureFromRankingFilterJaql: (jaql: RankingFilterJaql | CustomFormulaJaql, rankingMessage?: string) => BaseMeasure | CalculatedMeasure;
@@ -29,6 +29,7 @@ const simple_column_types_js_1 = require("../../simple-column-types.js");
29
29
  const types_js_1 = require("../../types.js");
30
30
  const measureFactory = __importStar(require("../../measures/factory.js"));
31
31
  const factory_js_1 = require("../../measures/factory.js");
32
+ const measures_js_1 = require("../../measures/measures.js");
32
33
  const DATA_MODEL_MODULE_NAME = 'DM';
33
34
  /**
34
35
  * Creates an attribute or level attribute from the provided parameters
@@ -86,7 +87,7 @@ exports.createAttributeFromFilterJaql = createAttributeFromFilterJaql;
86
87
  */
87
88
  const createMeasureHelper = (dim, table, column, level, dataType, agg, title, dataSource) => {
88
89
  const attribute = (0, exports.createAttributeHelper)(dim, table, column, level, dataType, title, dataSource);
89
- const measure = measureFactory.aggregate(attribute, agg);
90
+ const measure = measureFactory.aggregate(attribute, agg, title);
90
91
  measure.composeCode = `measureFactory.${agg}(${attribute.composeCode})`;
91
92
  return measure;
92
93
  };
@@ -115,7 +116,7 @@ const createMeasureFromFilterJaql = (jaql) => {
115
116
  const { dim, table, column, title, level, datatype: dataType, agg, datasource: dataSource, } = jaql;
116
117
  if (!agg)
117
118
  return undefined;
118
- return (0, exports.createMeasureHelper)(dim, table, column, level, dataType, agg, title, dataSource);
119
+ return (0, exports.createMeasureHelper)(dim, table, column, level, dataType, measures_js_1.DimensionalBaseMeasure.aggregationFromJAQL(agg), title, dataSource);
119
120
  };
120
121
  exports.createMeasureFromFilterJaql = createMeasureFromFilterJaql;
121
122
  /**
@@ -124,10 +125,10 @@ exports.createMeasureFromFilterJaql = createMeasureFromFilterJaql;
124
125
  * @param jaql - Ranking filter Jaql object
125
126
  * @returns Measure
126
127
  */
127
- const createMeasureFromRankingFilterJaql = (jaql) => {
128
+ const createMeasureFromRankingFilterJaql = (jaql, rankingMessage) => {
128
129
  if ('formula' in jaql)
129
130
  return (0, exports.createCalculatedMeasureFromJaql)(jaql);
130
131
  const { dim, table, column, level, datatype: dataType, agg } = jaql;
131
- return (0, exports.createMeasureHelper)(dim, table, column, level, dataType, agg);
132
+ return (0, exports.createMeasureHelper)(dim, table, column, level, dataType, measures_js_1.DimensionalBaseMeasure.aggregationFromJAQL(agg), rankingMessage);
132
133
  };
133
134
  exports.createMeasureFromRankingFilterJaql = createMeasureFromRankingFilterJaql;
@@ -28,6 +28,7 @@ const types_js_1 = require("./types.js");
28
28
  const filter_code_util_js_1 = require("./filter-code-util.js");
29
29
  const filterFactory = __importStar(require("../factory.js"));
30
30
  const attribute_measure_util_js_1 = require("./attribute-measure-util.js");
31
+ const translatable_error_js_1 = require("../../../translation/translatable-error.js");
31
32
  const isTopCondition = (filter) => filter.top !== undefined;
32
33
  const isBottomCondition = (filter) => filter.bottom !== undefined;
33
34
  const isExcludeCondition = (filter) => { var _a; return !!((_a = filter.exclude) === null || _a === void 0 ? void 0 : _a.members); };
@@ -108,12 +109,12 @@ exports.getSelectedConditionOption = getSelectedConditionOption;
108
109
  * @returns attribute filter
109
110
  */
110
111
  const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilterJaql, guid) => {
111
- var _a, _b, _c;
112
+ var _a, _b, _c, _d, _e, _f;
112
113
  const conditionType = (0, exports.getSelectedConditionOption)(conditionFilterJaql);
113
114
  switch (conditionType) {
114
115
  case types_js_1.ConditionFilterType.BOTTOM:
115
116
  if (conditionFilterJaql.by) {
116
- return (0, filter_code_util_js_1.withComposeCode)(filterFactory.bottomRanking)(attribute, (0, attribute_measure_util_js_1.createMeasureFromRankingFilterJaql)(conditionFilterJaql.by), conditionFilterJaql[types_js_1.ConditionFilterType.BOTTOM], guid);
117
+ return (0, filter_code_util_js_1.withComposeCode)(filterFactory.bottomRanking)(attribute, (0, attribute_measure_util_js_1.createMeasureFromRankingFilterJaql)(conditionFilterJaql.by, conditionFilterJaql.rankingMessage), conditionFilterJaql[types_js_1.ConditionFilterType.BOTTOM], guid);
117
118
  }
118
119
  break;
119
120
  case types_js_1.ConditionFilterType.EQUALS:
@@ -126,7 +127,7 @@ const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilter
126
127
  return (0, filter_code_util_js_1.withComposeCode)(filterFactory.greaterThanOrEqual)(attribute, conditionFilterJaql[types_js_1.ConditionFilterType.GREATER_THAN_OR_EQUAL], guid);
127
128
  case types_js_1.ConditionFilterType.TOP:
128
129
  if (conditionFilterJaql.by) {
129
- return (0, filter_code_util_js_1.withComposeCode)(filterFactory.topRanking)(attribute, (0, attribute_measure_util_js_1.createMeasureFromRankingFilterJaql)(conditionFilterJaql.by), conditionFilterJaql[types_js_1.ConditionFilterType.TOP], guid);
130
+ return (0, filter_code_util_js_1.withComposeCode)(filterFactory.topRanking)(attribute, (0, attribute_measure_util_js_1.createMeasureFromRankingFilterJaql)(conditionFilterJaql.by, conditionFilterJaql.rankingMessage), conditionFilterJaql[types_js_1.ConditionFilterType.TOP], guid);
130
131
  }
131
132
  break;
132
133
  case types_js_1.ConditionFilterType.STARTS_WITH:
@@ -157,9 +158,13 @@ const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilter
157
158
  return (0, filter_code_util_js_1.withComposeCode)(filterFactory.union)(conditionFilterJaql.or.map((c) => (0, exports.createAttributeFilterFromConditionFilterJaql)(attribute, c, guid)), guid);
158
159
  }
159
160
  break;
160
- case types_js_1.ConditionFilterType.IS_NOT:
161
+ case types_js_1.ConditionFilterType.IS_NOT: {
162
+ const deactivatedMembers = (((_c = conditionFilterJaql.filter) === null || _c === void 0 ? void 0 : _c.turnedOff) && ((_d = conditionFilterJaql.filter.exclude) === null || _d === void 0 ? void 0 : _d.members)) ||
163
+ [];
164
+ const selectedMembers = ((_f = (_e = conditionFilterJaql.exclude) === null || _e === void 0 ? void 0 : _e.members) === null || _f === void 0 ? void 0 : _f.filter((member) => !deactivatedMembers.includes(member))) || [];
161
165
  // use members filter with exclude instead of exclude filter
162
- return (0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, ((_c = conditionFilterJaql.exclude) === null || _c === void 0 ? void 0 : _c.members) || [], true, guid);
166
+ return (0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, selectedMembers, true, guid, deactivatedMembers, undefined, conditionFilterJaql.multiSelection);
167
+ }
163
168
  case types_js_1.ConditionFilterType.AFTER:
164
169
  case types_js_1.ConditionFilterType.BEFORE:
165
170
  case types_js_1.ConditionFilterType.IS_EMPTY:
@@ -167,7 +172,9 @@ const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilter
167
172
  // TODO Handle these cases later; may need filterFactory function added first
168
173
  break;
169
174
  }
170
- throw 'Jaql contains unsupported condition filter: ' + JSON.stringify(conditionFilterJaql);
175
+ throw new translatable_error_js_1.TranslatableError('errors.filter.unsupportedConditionFilter', {
176
+ filter: JSON.stringify(conditionFilterJaql),
177
+ });
171
178
  };
172
179
  exports.createAttributeFilterFromConditionFilterJaql = createAttributeFilterFromConditionFilterJaql;
173
180
  /**
@@ -194,6 +201,8 @@ const createMeasureFilterFromConditionFilterJaql = (measure, conditionFilterJaql
194
201
  case types_js_1.ConditionFilterType.BETWEEN:
195
202
  return (0, filter_code_util_js_1.withComposeCode)(filterFactory.measureBetween)(measure, conditionFilterJaql.from, conditionFilterJaql.to, guid);
196
203
  }
197
- throw 'Jaql contains unsupported condition filter: ' + JSON.stringify(conditionFilterJaql);
204
+ throw new translatable_error_js_1.TranslatableError('errors.filter.unsupportedConditionFilter', {
205
+ filter: JSON.stringify(conditionFilterJaql),
206
+ });
198
207
  };
199
208
  exports.createMeasureFilterFromConditionFilterJaql = createMeasureFilterFromConditionFilterJaql;
@@ -25,7 +25,7 @@ export declare const createFilterIncludeAll: (attribute: Attribute, guid?: strin
25
25
  * @param guid - Optional GUID for the filter
26
26
  * @returns Filter object
27
27
  */
28
- export declare const createFilterFromSpecificItemsFilterJaql: (attribute: Attribute, specificItemsFilterJaql: SpecificItemsFilterJaql, guid?: string) => Filter;
28
+ export declare const createFilterFromSpecificItemsFilterJaql: (attribute: Attribute, specificItemsFilterJaql: SpecificItemsFilterJaql, guid?: string, multiSelection?: boolean) => Filter;
29
29
  /**
30
30
  * Creates a filter from a date range filter JAQL object.
31
31
  *
@@ -31,6 +31,7 @@ const filter_types_util_js_1 = require("./filter-types-util.js");
31
31
  const filter_code_util_js_1 = require("./filter-code-util.js");
32
32
  const attribute_measure_util_js_1 = require("./attribute-measure-util.js");
33
33
  const utils_js_1 = require("../../../utils.js");
34
+ const translatable_error_js_1 = require("../../../translation/translatable-error.js");
34
35
  /**
35
36
  * Creates a generic filter (aka pass-through JAQL filter) if the JAQL cannot be translated to a specific filter type.
36
37
  *
@@ -84,11 +85,11 @@ exports.createFilterIncludeAll = createFilterIncludeAll;
84
85
  * @param guid - Optional GUID for the filter
85
86
  * @returns Filter object
86
87
  */
87
- const createFilterFromSpecificItemsFilterJaql = (attribute, specificItemsFilterJaql, guid) => {
88
+ const createFilterFromSpecificItemsFilterJaql = (attribute, specificItemsFilterJaql, guid, multiSelection) => {
88
89
  const deactivatedMembers = getDeactivatedMembersFromFilterJaql(specificItemsFilterJaql);
89
90
  const activeMembers = getActiveMembersFromFilterJaql(specificItemsFilterJaql, deactivatedMembers);
90
91
  return (0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, activeMembers, undefined, // use undefined instead of false to avoid including the property in composeCode
91
- guid, deactivatedMembers);
92
+ guid, deactivatedMembers, undefined, multiSelection);
92
93
  };
93
94
  exports.createFilterFromSpecificItemsFilterJaql = createFilterFromSpecificItemsFilterJaql;
94
95
  function getDeactivatedMembersFromFilterJaql(filterJaql) {
@@ -183,7 +184,9 @@ const createFilterFromJaqlInternal = (jaql, guid) => {
183
184
  try {
184
185
  if ('formula' in jaql) {
185
186
  // generic pass-through JAQL filter will be used instead
186
- throw 'Formula-based filter not supported yet: ' + JSON.stringify(jaql);
187
+ throw new translatable_error_js_1.TranslatableError('errors.filter.formulaFiltersNotSupported', {
188
+ filter: JSON.stringify(jaql),
189
+ });
187
190
  }
188
191
  const filterJaqlWrapperWithType = (0, filter_types_util_js_1.extractFilterTypeFromFilterJaql)(jaql, jaql.datatype);
189
192
  const { filter: filterJaqlWithType } = filterJaqlWrapperWithType;
@@ -194,7 +197,7 @@ const createFilterFromJaqlInternal = (jaql, guid) => {
194
197
  case types_js_1.FILTER_TYPES.INCLUDE_ALL:
195
198
  return (0, exports.createFilterIncludeAll)(attribute, guid);
196
199
  case types_js_1.FILTER_TYPES.SPECIFIC_ITEMS:
197
- return (0, exports.createFilterFromSpecificItemsFilterJaql)(attribute, filterJaqlWithType, guid);
200
+ return (0, exports.createFilterFromSpecificItemsFilterJaql)(attribute, filterJaqlWithType, guid, filterJaqlWithType.multiSelection);
198
201
  case types_js_1.FILTER_TYPES.CONDITION:
199
202
  return (0, exports.createFilterFromConditionFilterJaql)(attribute, filterJaqlWithType, measure, guid);
200
203
  case types_js_1.FILTER_TYPES.DATE_RANGE:
@@ -485,6 +485,7 @@ export declare type FilterRelationsJaqlIdNode = {
485
485
  };
486
486
  /**
487
487
  * A node of a {@link FilterRelationsModel} tree that represents a filter
488
+ *
488
489
  * @internal
489
490
  */
490
491
  export declare type FilterRelationsModelIdNode = {
@@ -0,0 +1,36 @@
1
+ import { DimensionalElement } from './base.js';
2
+ import { SortDirection } from './interfaces.js';
3
+ import { MetadataItem } from './types.js';
4
+ /**
5
+ * This implementation wraps metadata for a JAQL query. The metadata could be
6
+ * for a dimension, measure, or filter. We do little to no interpretation of
7
+ * the JAQL as it is designed to be "passed through" to the query execution
8
+ * step.
9
+ *
10
+ * This will typically be used for JAQL metadata that is coming from a Sisense
11
+ * instance and is assumed to be correct (e.g. dashboard widget, NLQ
12
+ * suggestion).
13
+ *
14
+ * @param item - the metadata item in a JAQL query
15
+ * @param type - the data type of the dimension
16
+ * @internal
17
+ */
18
+ export declare class JaqlElement extends DimensionalElement {
19
+ private readonly metadataItem;
20
+ expression: string;
21
+ skipValidation: boolean;
22
+ aggregation?: string;
23
+ formula?: string;
24
+ sortType?: SortDirection;
25
+ constructor(item: MetadataItem, type: string);
26
+ get id(): string;
27
+ jaql(): MetadataItem;
28
+ }
29
+ /**
30
+ * Create a JaqlElement from a MetadataItem
31
+ *
32
+ * @param item - the metadata item in a JAQL query
33
+ * @returns a JaqlElement
34
+ * @internal
35
+ */
36
+ export declare function createJaqlElement(item: MetadataItem): JaqlElement;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createJaqlElement = exports.JaqlElement = void 0;
4
+ const base_js_1 = require("./base.js");
5
+ const utils_js_1 = require("../utils.js");
6
+ const types_js_1 = require("./types.js");
7
+ /**
8
+ * This implementation wraps metadata for a JAQL query. The metadata could be
9
+ * for a dimension, measure, or filter. We do little to no interpretation of
10
+ * the JAQL as it is designed to be "passed through" to the query execution
11
+ * step.
12
+ *
13
+ * This will typically be used for JAQL metadata that is coming from a Sisense
14
+ * instance and is assumed to be correct (e.g. dashboard widget, NLQ
15
+ * suggestion).
16
+ *
17
+ * @param item - the metadata item in a JAQL query
18
+ * @param type - the data type of the dimension
19
+ * @internal
20
+ */
21
+ class JaqlElement extends base_js_1.DimensionalElement {
22
+ constructor(item, type) {
23
+ var _a;
24
+ super((_a = item.jaql.title) !== null && _a !== void 0 ? _a : '', type);
25
+ this.expression = (item.jaql.dim || item.jaql.formula);
26
+ this.metadataItem = item;
27
+ if (item.jaql.agg) {
28
+ this.aggregation = item.jaql.agg;
29
+ }
30
+ else {
31
+ delete this.aggregation;
32
+ }
33
+ if (item.jaql.formula) {
34
+ this.formula = item.jaql.formula;
35
+ }
36
+ else {
37
+ delete this.formula;
38
+ }
39
+ if (item.jaql.sort) {
40
+ this.sortType = (0, utils_js_1.getSortType)(item.jaql.sort);
41
+ }
42
+ else {
43
+ delete this.sortType;
44
+ }
45
+ this.skipValidation = true;
46
+ }
47
+ get id() {
48
+ return this.expression;
49
+ }
50
+ jaql() {
51
+ return this.metadataItem;
52
+ }
53
+ }
54
+ exports.JaqlElement = JaqlElement;
55
+ const toMetadataType = {
56
+ text: types_js_1.MetadataTypes.TextAttribute,
57
+ numeric: types_js_1.MetadataTypes.NumericAttribute,
58
+ datetime: types_js_1.MetadataTypes.DateLevel,
59
+ };
60
+ /**
61
+ * Create a JaqlElement from a MetadataItem
62
+ *
63
+ * @param item - the metadata item in a JAQL query
64
+ * @returns a JaqlElement
65
+ * @internal
66
+ */
67
+ function createJaqlElement(item) {
68
+ var _a;
69
+ // TODO: measures with a "formula" may not have a datatype. force this to be numeric because aggregations
70
+ // will always be of type number. check if there is a more correct way to do this
71
+ return new JaqlElement(item, (_a = toMetadataType[item.jaql.datatype]) !== null && _a !== void 0 ? _a : 'numeric');
72
+ }
73
+ exports.createJaqlElement = createJaqlElement;
@@ -11,6 +11,7 @@ const mapValues_js_1 = __importDefault(require("lodash-es/mapValues.js"));
11
11
  const attributes_js_1 = require("../attributes.js");
12
12
  const simple_column_types_js_1 = require("./../simple-column-types.js");
13
13
  const utils_js_1 = require("../../utils.js");
14
+ const translatable_error_js_1 = require("../../translation/translatable-error.js");
14
15
  /**
15
16
  * Defines the different numeric operators that can be used with numeric filters
16
17
  *
@@ -115,7 +116,7 @@ function transformCustomFormulaJaql(jaql) {
115
116
  var _a;
116
117
  const isFormulaJaql = 'formula' in jaql;
117
118
  if (!isFormulaJaql) {
118
- throw new Error('Jaql is not a formula');
119
+ throw new translatable_error_js_1.TranslatableError('errors.measure.notAFormula');
119
120
  }
120
121
  const sort = (0, utils_js_1.convertSort)(jaql.sort);
121
122
  const context = (0, mapValues_js_1.default)((_a = jaql.context) !== null && _a !== void 0 ? _a : {}, (jaqlContextValue) => jaqlContextValue ? transformFormulaJaqlHelper(jaqlContextValue) : {});