@sisense/sdk-data 1.7.2 → 1.9.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 (34) hide show
  1. package/README.md +1 -1
  2. package/dist/dimensional-model/analytics/factory.js +2 -2
  3. package/dist/dimensional-model/attributes.d.ts +11 -0
  4. package/dist/dimensional-model/attributes.js +20 -1
  5. package/dist/dimensional-model/dimensions.js +5 -4
  6. package/dist/dimensional-model/factory.js +0 -1
  7. package/dist/dimensional-model/filters/factory.d.ts +58 -0
  8. package/dist/dimensional-model/filters/factory.js +68 -0
  9. package/dist/dimensional-model/filters/filters.js +0 -3
  10. package/dist/dimensional-model/filters/utils/attribute-measure-util.d.ts +47 -0
  11. package/dist/dimensional-model/filters/utils/attribute-measure-util.js +77 -0
  12. package/dist/dimensional-model/filters/utils/condition-filter-util.d.ts +19 -0
  13. package/dist/dimensional-model/filters/utils/condition-filter-util.js +162 -0
  14. package/dist/dimensional-model/filters/utils/date-time-filter-util.d.ts +2 -0
  15. package/dist/dimensional-model/filters/utils/date-time-filter-util.js +8 -0
  16. package/dist/dimensional-model/filters/utils/filter-code-util.d.ts +13 -0
  17. package/dist/dimensional-model/filters/utils/filter-code-util.js +49 -0
  18. package/dist/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +67 -0
  19. package/dist/dimensional-model/filters/utils/filter-from-jaql-util.js +149 -0
  20. package/dist/dimensional-model/filters/utils/filter-types-util.d.ts +15 -0
  21. package/dist/dimensional-model/filters/utils/filter-types-util.js +71 -0
  22. package/dist/dimensional-model/filters/utils/types.d.ts +200 -0
  23. package/dist/dimensional-model/filters/utils/types.js +96 -0
  24. package/dist/dimensional-model/interfaces.d.ts +58 -8
  25. package/dist/dimensional-model/measures/factory.d.ts +15 -2
  26. package/dist/dimensional-model/measures/factory.js +17 -2
  27. package/dist/dimensional-model/measures/measures.js +1 -4
  28. package/dist/dimensional-model/types.d.ts +37 -5
  29. package/dist/dimensional-model/types.js +6 -8
  30. package/dist/index.d.ts +0 -2
  31. package/dist/index.js +0 -2
  32. package/dist/utils.d.ts +12 -1
  33. package/dist/utils.js +17 -0
  34. package/package.json +3 -3
package/README.md CHANGED
@@ -1,3 +1,3 @@
1
1
  This library, which is a part of Sisense Compose SDK, is
2
- for implementing the elements of [dimensional modeling](https://docs.sisense.com/main/SisenseLinux/data-model-building-practices.htm?tocpath=Modeling%20Data%7C_____4)
2
+ for implementing the elements of dimensional modeling
3
3
  including dimensions, attributes, measures, and filters.
@@ -97,7 +97,7 @@ export const boxWhiskerIqrOutliers = (target) => {
97
97
  });
98
98
  outliersAttrWithInnerFilter.name = `${outliersAttrWithInnerFilter.name} (Outliers)`;
99
99
  outliersAttrWithInnerFilter.jaql = () => {
100
- return Object.assign(Object.assign({}, target.jaql()), { filter: {
100
+ return Object.assign(Object.assign({}, target.jaql(true)), { filter: {
101
101
  or: [
102
102
  {
103
103
  fromNotEqual: outliersMax.jaql(true),
@@ -125,7 +125,7 @@ export const boxWhiskerStdDevOutliers = (target) => {
125
125
  Attr: target,
126
126
  });
127
127
  outliersAttrWithInnerFilter.jaql = () => {
128
- return Object.assign(Object.assign({}, target.jaql()), { filter: {
128
+ return Object.assign(Object.assign({}, target.jaql(true)), { filter: {
129
129
  or: [
130
130
  {
131
131
  fromNotEqual: outliersMax.jaql(true),
@@ -125,3 +125,14 @@ export declare function createAttribute(json: any): Attribute;
125
125
  * @internal
126
126
  */
127
127
  export declare function createLevel(json: any): LevelAttribute;
128
+ /**
129
+ * Normalize attribute name
130
+ *
131
+ * @param tableName - Table name (e.g., Commerce Sales)
132
+ * @param columnName - Column name (e.g., Order Date)
133
+ * @param dateLevel - Date level (e.g., Years)
134
+ * @param modelName - module name (e.g., DM)
135
+ * @return full normalized attribute name (e.g., DM.CommerceSales.OrderDate.Years)
136
+ * @internal
137
+ */
138
+ export declare function normalizeAttributeName(tableName: string, columnName: string, dateLevel?: string, modelName?: string): string;
@@ -207,7 +207,7 @@ export class DimensionalLevelAttribute extends DimensionalAttribute {
207
207
  }
208
208
  static translateJaqlToGranularity(json) {
209
209
  const returnUnsupported = (lvl) => {
210
- console.warn('Unsupported granularity');
210
+ console.warn('Unsupported granularity', lvl);
211
211
  return lvl;
212
212
  };
213
213
  if (json.dateTimeLevel) {
@@ -281,3 +281,22 @@ export function createAttribute(json) {
281
281
  export function createLevel(json) {
282
282
  return new DimensionalLevelAttribute(json.name || json.title, json.attribute || json.expression || json.dim, json.granularity, json.format, json.desc || json.description);
283
283
  }
284
+ /**
285
+ * Normalize attribute name
286
+ *
287
+ * @param tableName - Table name (e.g., Commerce Sales)
288
+ * @param columnName - Column name (e.g., Order Date)
289
+ * @param dateLevel - Date level (e.g., Years)
290
+ * @param modelName - module name (e.g., DM)
291
+ * @return full normalized attribute name (e.g., DM.CommerceSales.OrderDate.Years)
292
+ * @internal
293
+ */
294
+ export function normalizeAttributeName(tableName, columnName, dateLevel, modelName) {
295
+ return ((modelName && modelName.length > 0 ? modelName + '.' : '') +
296
+ normalizeName(tableName) +
297
+ '.' +
298
+ normalizeName(columnName) +
299
+ (dateLevel && dateLevel.length > 0
300
+ ? '.' + DimensionalLevelAttribute.translateJaqlToGranularity({ level: dateLevel })
301
+ : ''));
302
+ }
@@ -247,7 +247,7 @@ export function createDimension(json) {
247
247
  const type = DimensionalDimension.parseType(json.dimtype || json.type);
248
248
  // date dimension
249
249
  if (type == MetadataTypes.DateDimension) {
250
- return new DimensionalDateDimension(name, expression);
250
+ return new DimensionalDateDimension(name, expression, description);
251
251
  }
252
252
  // attributes
253
253
  const atts = Object.getOwnPropertyNames(json)
@@ -258,12 +258,12 @@ export function createDimension(json) {
258
258
  let att;
259
259
  for (let i = 0; i < json.attributes.length; i++) {
260
260
  att = json.attributes[i];
261
- atts.push(new DimensionalAttribute(att.name, att.expression, att.type));
261
+ atts.push(new DimensionalAttribute(att.name, att.expression, att.type, att.description));
262
262
  }
263
263
  }
264
264
  // default attribute
265
265
  else if (expression) {
266
- atts.push(new DimensionalAttribute(name, expression));
266
+ atts.push(new DimensionalAttribute(name, expression, type, description));
267
267
  }
268
268
  }
269
269
  // nested dimensions
@@ -295,5 +295,6 @@ export function createDimension(json) {
295
295
  export function createDateDimension(json) {
296
296
  const name = json.name || json.title;
297
297
  const expression = json.expression || json.dim;
298
- return new DimensionalDateDimension(name, expression);
298
+ const description = json.desc || json.description;
299
+ return new DimensionalDateDimension(name, expression, description);
299
300
  }
@@ -1,4 +1,3 @@
1
- /* eslint-disable complexity */
2
1
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
2
  import { MetadataTypes } from './types.js';
4
3
  import { createMeasure } from './measures/measures.js';
@@ -523,6 +523,39 @@ export declare function today(dimension: DateDimension): Filter;
523
523
  * @internal
524
524
  */
525
525
  export declare function measureBase(attribute: Attribute, measure: Measure, operatorA?: string, valueA?: number, operatorB?: string, valueB?: number): Filter;
526
+ /**
527
+ * Creates a filter to isolate a measure value equal to a given number.
528
+ *
529
+ * @example
530
+ * Filter for categories that have an average revenue equal 50 in the Sample ECommerce data model.
531
+ * ```ts
532
+ * filterFactory.measureEquals(
533
+ * measures.average(DM.Commerce.Revenue),
534
+ * 50
535
+ * )
536
+ * ```
537
+ * @param measure - Measure to filter by
538
+ * @param value - Value
539
+ * @returns A filter instance
540
+ */
541
+ export declare function measureEquals(measure: BaseMeasure, value: number): Filter;
542
+ /**
543
+ * Creates a filter to isolate a measure value greater than to a given number.
544
+ *
545
+ * @example
546
+ * Filter for categories that have an average revenue greater than
547
+ * to 50 in the Sample ECommerce data model.
548
+ * ```ts
549
+ * filterFactory.measureGreaterThan(
550
+ * measures.average(DM.Commerce.Revenue),
551
+ * 50
552
+ * )
553
+ * ```
554
+ * @param measure - Measure to filter by
555
+ * @param value - Min value
556
+ * @returns A filter instance
557
+ */
558
+ export declare function measureGreaterThan(measure: BaseMeasure, value: number): Filter;
526
559
  /**
527
560
  * Creates a filter to isolate a measure value greater than or equal to a given number.
528
561
  *
@@ -557,6 +590,22 @@ export declare function measureGreaterThanOrEqual(measure: BaseMeasure, value: n
557
590
  * @returns A filter instance
558
591
  */
559
592
  export declare function measureLessThanOrEqual(measure: BaseMeasure, value: number): Filter;
593
+ /**
594
+ * Creates a filter to isolate a measure value less than a given number.
595
+ *
596
+ * @example
597
+ * Filter for categories that have an average revenue less than 100 in the Sample ECommerce data model.
598
+ * ```ts
599
+ * filterFactory.measureLessThan(
600
+ * measures.average(DM.Commerce.Revenue),
601
+ * 100
602
+ * )
603
+ * ```
604
+ * @param measure - Measure to filter by
605
+ * @param value - Value
606
+ * @returns A filter instance
607
+ */
608
+ export declare function measureLessThan(measure: BaseMeasure, value: number): Filter;
560
609
  /**
561
610
  * Creates a filter to isolate a measure value between or equal to two given numbers.
562
611
  *
@@ -698,3 +747,12 @@ export declare namespace logic {
698
747
  */
699
748
  const or: (left: FilterRelationsNode, right: FilterRelationsNode) => FilterRelations;
700
749
  }
750
+ /**
751
+ * Creates a filter from JAQL
752
+ *
753
+ * @param jaql - Filter Jaql
754
+ * @param instanceid - Filter instance id
755
+ * @returns A filter instance
756
+ * @internal
757
+ */
758
+ export declare function customFilter(jaql: any, instanceid?: string): Filter;
@@ -1,4 +1,5 @@
1
1
  import { TextOperators, NumericOperators, DateOperators, LogicalOperators, RankingOperators, LogicalAttributeFilter, MembersFilter, ExcludeFilter, NumericFilter, MeasureFilter, RankingFilter, TextFilter, DateRangeFilter, RelativeDateFilter, } from './filters.js';
2
+ import { createGenericFilter } from './utils/filter-from-jaql-util.js';
2
3
  // LOGICAL FILTERS
3
4
  /**
4
5
  * Creates a filter representing the union of multiple filters on the same attribute. The resulting
@@ -599,6 +600,43 @@ export function today(dimension) {
599
600
  export function measureBase(attribute, measure, operatorA, valueA, operatorB, valueB) {
600
601
  return new MeasureFilter(attribute, measure, operatorA, valueA, operatorB, valueB);
601
602
  }
603
+ /**
604
+ * Creates a filter to isolate a measure value equal to a given number.
605
+ *
606
+ * @example
607
+ * Filter for categories that have an average revenue equal 50 in the Sample ECommerce data model.
608
+ * ```ts
609
+ * filterFactory.measureEquals(
610
+ * measures.average(DM.Commerce.Revenue),
611
+ * 50
612
+ * )
613
+ * ```
614
+ * @param measure - Measure to filter by
615
+ * @param value - Value
616
+ * @returns A filter instance
617
+ */
618
+ export function measureEquals(measure, value) {
619
+ return measureBase(measure.attribute, measure, NumericOperators.Equals, value);
620
+ }
621
+ /**
622
+ * Creates a filter to isolate a measure value greater than to a given number.
623
+ *
624
+ * @example
625
+ * Filter for categories that have an average revenue greater than
626
+ * to 50 in the Sample ECommerce data model.
627
+ * ```ts
628
+ * filterFactory.measureGreaterThan(
629
+ * measures.average(DM.Commerce.Revenue),
630
+ * 50
631
+ * )
632
+ * ```
633
+ * @param measure - Measure to filter by
634
+ * @param value - Min value
635
+ * @returns A filter instance
636
+ */
637
+ export function measureGreaterThan(measure, value) {
638
+ return measureBase(measure.attribute, measure, NumericOperators.FromNotEqual, value);
639
+ }
602
640
  /**
603
641
  * Creates a filter to isolate a measure value greater than or equal to a given number.
604
642
  *
@@ -637,6 +675,24 @@ export function measureGreaterThanOrEqual(measure, value) {
637
675
  export function measureLessThanOrEqual(measure, value) {
638
676
  return measureBase(measure.attribute, measure, NumericOperators.To, value);
639
677
  }
678
+ /**
679
+ * Creates a filter to isolate a measure value less than a given number.
680
+ *
681
+ * @example
682
+ * Filter for categories that have an average revenue less than 100 in the Sample ECommerce data model.
683
+ * ```ts
684
+ * filterFactory.measureLessThan(
685
+ * measures.average(DM.Commerce.Revenue),
686
+ * 100
687
+ * )
688
+ * ```
689
+ * @param measure - Measure to filter by
690
+ * @param value - Value
691
+ * @returns A filter instance
692
+ */
693
+ export function measureLessThan(measure, value) {
694
+ return measureBase(measure.attribute, measure, NumericOperators.ToNotEqual, value);
695
+ }
640
696
  /**
641
697
  * Creates a filter to isolate a measure value between or equal to two given numbers.
642
698
  *
@@ -810,3 +866,15 @@ export var logic;
810
866
  right: relate(right),
811
867
  });
812
868
  })(logic = logic || (logic = {}));
869
+ // CUSTOM FILTER
870
+ /**
871
+ * Creates a filter from JAQL
872
+ *
873
+ * @param jaql - Filter Jaql
874
+ * @param instanceid - Filter instance id
875
+ * @returns A filter instance
876
+ * @internal
877
+ */
878
+ export function customFilter(jaql, instanceid) {
879
+ return createGenericFilter(jaql, instanceid);
880
+ }
@@ -2,11 +2,8 @@
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
3
  /* eslint-disable @typescript-eslint/no-unsafe-return */
4
4
  /* eslint-disable @typescript-eslint/no-unsafe-call */
5
- /* eslint-disable max-lines */
6
5
  /* eslint-disable max-params */
7
6
  /* eslint-disable @typescript-eslint/restrict-template-expressions */
8
- /* eslint-disable max-lines-per-function */
9
- /* eslint-disable complexity */
10
7
  /* eslint-disable @typescript-eslint/no-unsafe-argument */
11
8
  import hash from 'object-hash';
12
9
  import { DimensionalElement } from '../base.js';
@@ -0,0 +1,47 @@
1
+ import { Attribute, BaseMeasure, LevelAttribute } from '../../interfaces.js';
2
+ import { FilterJaql } from '../../types.js';
3
+ import { FilterJaqlInternal, RankingFilterJaql } from './types.js';
4
+ /**
5
+ * Creates an attribute or level attribute from the provided parameters
6
+ *
7
+ * @param dim - Dimension expression
8
+ * @param table - Table name
9
+ * @param column - Column name
10
+ * @param level - Date level
11
+ * @param dataType - Data type
12
+ * @returns attribute or level attribute
13
+ */
14
+ export declare const createAttributeHelper: (dim: string, table: string, column: string, level: string | undefined, dataType: string) => Attribute | LevelAttribute;
15
+ /**
16
+ * Creates an attribute or level attribute from the provided filter JAQL object
17
+ *
18
+ * @param jaql - Filter JAQL object
19
+ * @returns attribute or level attribute
20
+ */
21
+ export declare const createAttributeFromFilterJaql: (jaql: FilterJaql | FilterJaqlInternal) => Attribute | LevelAttribute;
22
+ /**
23
+ * Creates a measure from the provided parameters
24
+ *
25
+ * @param dim - Dimension expression
26
+ * @param table - Table name
27
+ * @param column - Column name
28
+ * @param level - Date level
29
+ * @param dataType - Data type
30
+ * @param agg - Aggregation function
31
+ * @returns measure
32
+ */
33
+ export declare const createMeasureHelper: (dim: string, table: string, column: string, level: string | undefined, dataType: string, agg: string) => BaseMeasure;
34
+ /**
35
+ * Creates a measure from the provided filter JAQL object
36
+ *
37
+ * @param jaql - Filter JAQL object
38
+ * @returns Measure
39
+ */
40
+ export declare const createMeasureFromFilterJaql: (jaql: FilterJaqlInternal) => BaseMeasure | undefined;
41
+ /**
42
+ * Creates a measure from the provided ranking filter JAQL object
43
+ *
44
+ * @param jaql - Ranking filter Jaql object
45
+ * @returns Measure
46
+ */
47
+ export declare const createMeasureFromRankingFilterJaql: (jaql: RankingFilterJaql) => BaseMeasure;
@@ -0,0 +1,77 @@
1
+ import { DimensionalAttribute, DimensionalLevelAttribute, normalizeAttributeName, } from '../../attributes.js';
2
+ import { isNumber } from '../../simple-column-types.js';
3
+ import { MetadataTypes } from '../../types.js';
4
+ import * as measureFactory from '../../measures/factory.js';
5
+ const DATA_MODEL_MODULE_NAME = 'DM';
6
+ /**
7
+ * Creates an attribute or level attribute from the provided parameters
8
+ *
9
+ * @param dim - Dimension expression
10
+ * @param table - Table name
11
+ * @param column - Column name
12
+ * @param level - Date level
13
+ * @param dataType - Data type
14
+ * @returns attribute or level attribute
15
+ */
16
+ export const createAttributeHelper = (dim, table, column, level, dataType) => {
17
+ if (level) {
18
+ const dateLevel = DimensionalLevelAttribute.translateJaqlToGranularity({ level });
19
+ const levelAttribute = new DimensionalLevelAttribute(column, dim, dateLevel);
20
+ levelAttribute.composeCode = normalizeAttributeName(table, column, level, DATA_MODEL_MODULE_NAME);
21
+ return levelAttribute;
22
+ }
23
+ const attributeType = isNumber(dataType)
24
+ ? MetadataTypes.NumericAttribute
25
+ : MetadataTypes.TextAttribute;
26
+ const attribute = new DimensionalAttribute(column, dim, attributeType);
27
+ attribute.composeCode = normalizeAttributeName(table, column, undefined, DATA_MODEL_MODULE_NAME);
28
+ return attribute;
29
+ };
30
+ /**
31
+ * Creates an attribute or level attribute from the provided filter JAQL object
32
+ *
33
+ * @param jaql - Filter JAQL object
34
+ * @returns attribute or level attribute
35
+ */
36
+ export const createAttributeFromFilterJaql = (jaql) => {
37
+ return createAttributeHelper(jaql.dim, jaql.table, jaql.column, jaql.level, jaql.datatype);
38
+ };
39
+ /**
40
+ * Creates a measure from the provided parameters
41
+ *
42
+ * @param dim - Dimension expression
43
+ * @param table - Table name
44
+ * @param column - Column name
45
+ * @param level - Date level
46
+ * @param dataType - Data type
47
+ * @param agg - Aggregation function
48
+ * @returns measure
49
+ */
50
+ export const createMeasureHelper = (dim, table, column, level, dataType, agg) => {
51
+ const attribute = createAttributeHelper(dim, table, column, level, dataType);
52
+ const measure = measureFactory.aggregate(attribute, agg);
53
+ measure.composeCode = `measureFactory.${agg}(${attribute.composeCode})`;
54
+ return measure;
55
+ };
56
+ /**
57
+ * Creates a measure from the provided filter JAQL object
58
+ *
59
+ * @param jaql - Filter JAQL object
60
+ * @returns Measure
61
+ */
62
+ export const createMeasureFromFilterJaql = (jaql) => {
63
+ const { dim, table, column, level, datatype: dataType, agg } = jaql;
64
+ if (!agg)
65
+ return undefined;
66
+ return createMeasureHelper(dim, table, column, level, dataType, agg);
67
+ };
68
+ /**
69
+ * Creates a measure from the provided ranking filter JAQL object
70
+ *
71
+ * @param jaql - Ranking filter Jaql object
72
+ * @returns Measure
73
+ */
74
+ export const createMeasureFromRankingFilterJaql = (jaql) => {
75
+ const { dim, table, column, level, datatype: dataType, agg } = jaql;
76
+ return createMeasureHelper(dim, table, column, level, dataType, agg);
77
+ };
@@ -0,0 +1,19 @@
1
+ import { ConditionFilterJaql, ConditionFilterType } from './types.js';
2
+ import { Attribute, BaseMeasure, Filter } from '../../interfaces.js';
3
+ export declare const getSelectedConditionOption: (filter: ConditionFilterJaql) => ConditionFilterType;
4
+ /**
5
+ * Creates an attribute filter from the provided attribute and condition filter JAQL object
6
+ *
7
+ * @param attribute - Provided attribute
8
+ * @param conditionFilterJaql - Condition filter JAQL object
9
+ * @returns attribute filter
10
+ */
11
+ export declare const createAttributeFilterFromConditionFilterJaql: (attribute: Attribute, conditionFilterJaql: ConditionFilterJaql) => Filter;
12
+ /**
13
+ * Creates a measure filter from the provided measure and condition filter JAQL object
14
+ *
15
+ * @param measure - Provided measure
16
+ * @param conditionFilterJaql - Condition filter JAQL object
17
+ * @returns measure filter
18
+ */
19
+ export declare const createMeasureFilterFromConditionFilterJaql: (measure: BaseMeasure, conditionFilterJaql: ConditionFilterJaql) => Filter;
@@ -0,0 +1,162 @@
1
+ import { ConditionFilterType } from './types.js';
2
+ import { withComposeCode } from './filter-code-util.js';
3
+ import * as filterFactory from '../factory.js';
4
+ import { createMeasureFromRankingFilterJaql } from './attribute-measure-util.js';
5
+ const isTopCondition = (filter) => filter.top !== undefined;
6
+ const isBottomCondition = (filter) => filter.bottom !== undefined;
7
+ const isExcludeCondition = (filter) => { var _a; return !!((_a = filter.exclude) === null || _a === void 0 ? void 0 : _a.members); };
8
+ const isMembersCondition = (filter) => !!filter.members && !!filter.isCondition;
9
+ const isWithinCondition = (filter) => { var _a, _b; return ((_a = filter.last) === null || _a === void 0 ? void 0 : _a.anchor) !== undefined || ((_b = filter.next) === null || _b === void 0 ? void 0 : _b.anchor) !== undefined; };
10
+ const isGreaterThanCondition = (filter) => filter.fromNotEqual !== undefined;
11
+ const isGreaterThanOrEqualCondition = (filter) => filter.from !== undefined && !filter.isBetween;
12
+ const isLessThanCondition = (filter) => filter.toNotEqual !== undefined;
13
+ const isLessThanOrEqualCondition = (filter) => filter.to !== undefined && !filter.isBetween;
14
+ const isEqualsCondition = (filter) => filter.equals !== undefined;
15
+ const isNotEqualCondition = (filter) => filter.doesntEqual !== undefined;
16
+ const isEmptyCondition = (filter) => !!(filter.equals === '' && filter.isEmpty);
17
+ const isNotEmptyCondition = (filter) => !!(filter.doesntEqual === '' && filter.isEmpty);
18
+ const isContainsCondition = (filter) => filter.contains !== undefined;
19
+ const isDoesntContainCondition = (filter) => filter.doesntContain !== undefined;
20
+ const isStartsWithCondition = (filter) => filter.startsWith !== undefined;
21
+ const isDoesntStartsWithCondition = (filter) => filter.doesntStartWith !== undefined;
22
+ const isEndsWithCondition = (filter) => filter.endsWith !== undefined;
23
+ const isDoesntEndWithCondition = (filter) => filter.doesntEndWith !== undefined;
24
+ const isBetweenCondition = (filter) => filter.from !== undefined && filter.to !== undefined;
25
+ const isNotBetweenCondition = (filter) => { var _a, _b; return ((_a = filter.exclude) === null || _a === void 0 ? void 0 : _a.from) !== undefined && ((_b = filter.exclude) === null || _b === void 0 ? void 0 : _b.to) !== undefined; };
26
+ const isMultipleCondition = (filter) => !!(filter.or || filter.and);
27
+ export const getSelectedConditionOption = (filter) => {
28
+ if (isBottomCondition(filter))
29
+ return ConditionFilterType.BOTTOM;
30
+ if (isTopCondition(filter))
31
+ return ConditionFilterType.TOP;
32
+ if (isExcludeCondition(filter))
33
+ return ConditionFilterType.IS_NOT;
34
+ if (isWithinCondition(filter))
35
+ return ConditionFilterType.IS_WITHIN;
36
+ if (isGreaterThanCondition(filter))
37
+ return ConditionFilterType.GREATER_THAN;
38
+ if (isGreaterThanOrEqualCondition(filter))
39
+ return ConditionFilterType.GREATER_THAN_OR_EQUAL;
40
+ if (isLessThanCondition(filter))
41
+ return ConditionFilterType.LESS_THAN;
42
+ if (isLessThanOrEqualCondition(filter))
43
+ return ConditionFilterType.LESS_THAN_OR_EQUAL;
44
+ if (isEqualsCondition(filter))
45
+ return ConditionFilterType.EQUALS;
46
+ if (isNotEqualCondition(filter))
47
+ return ConditionFilterType.DOESNT_EQUAL;
48
+ if (isEmptyCondition(filter))
49
+ return ConditionFilterType.IS_EMPTY;
50
+ if (isNotEmptyCondition(filter))
51
+ return ConditionFilterType.IS_NOT_EMPTY;
52
+ if (isContainsCondition(filter))
53
+ return ConditionFilterType.CONTAINS;
54
+ if (isDoesntContainCondition(filter))
55
+ return ConditionFilterType.DOESNT_CONTAIN;
56
+ if (isDoesntEndWithCondition(filter))
57
+ return ConditionFilterType.DOESNT_END_WITH;
58
+ if (isDoesntStartsWithCondition(filter))
59
+ return ConditionFilterType.DOESNT_START_WITH;
60
+ if (isEndsWithCondition(filter))
61
+ return ConditionFilterType.ENDS_WITH;
62
+ if (isStartsWithCondition(filter))
63
+ return ConditionFilterType.STARTS_WITH;
64
+ if (isBetweenCondition(filter))
65
+ return ConditionFilterType.BETWEEN;
66
+ if (isNotBetweenCondition(filter))
67
+ return ConditionFilterType.IS_NOT_BETWEEN;
68
+ if (isMembersCondition(filter))
69
+ return ConditionFilterType.IS;
70
+ if (isMultipleCondition(filter))
71
+ return ConditionFilterType.MULTIPLE_CONDITION;
72
+ return ConditionFilterType.NONE;
73
+ };
74
+ /**
75
+ * Creates an attribute filter from the provided attribute and condition filter JAQL object
76
+ *
77
+ * @param attribute - Provided attribute
78
+ * @param conditionFilterJaql - Condition filter JAQL object
79
+ * @returns attribute filter
80
+ */
81
+ export const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilterJaql) => {
82
+ var _a, _b;
83
+ const conditionType = getSelectedConditionOption(conditionFilterJaql);
84
+ switch (conditionType) {
85
+ case ConditionFilterType.BOTTOM:
86
+ if (conditionFilterJaql.by && 'agg' in conditionFilterJaql.by) {
87
+ return withComposeCode(filterFactory.bottomRanking)(attribute, createMeasureFromRankingFilterJaql(conditionFilterJaql.by), conditionFilterJaql[ConditionFilterType.BOTTOM]);
88
+ }
89
+ break;
90
+ case ConditionFilterType.EQUALS:
91
+ return withComposeCode(filterFactory.equals)(attribute, conditionFilterJaql[ConditionFilterType.EQUALS]);
92
+ case ConditionFilterType.GREATER_THAN:
93
+ return withComposeCode(filterFactory.greaterThan)(attribute, conditionFilterJaql[ConditionFilterType.GREATER_THAN]);
94
+ case ConditionFilterType.GREATER_THAN_OR_EQUAL:
95
+ return withComposeCode(filterFactory.greaterThanOrEqual)(attribute, conditionFilterJaql[ConditionFilterType.GREATER_THAN_OR_EQUAL]);
96
+ case ConditionFilterType.TOP:
97
+ if (conditionFilterJaql.by) {
98
+ return withComposeCode(filterFactory.topRanking)(attribute, createMeasureFromRankingFilterJaql(conditionFilterJaql.by), conditionFilterJaql[ConditionFilterType.TOP]);
99
+ }
100
+ break;
101
+ case ConditionFilterType.STARTS_WITH:
102
+ return withComposeCode(filterFactory.startsWith)(attribute, conditionFilterJaql[ConditionFilterType.STARTS_WITH]);
103
+ case ConditionFilterType.DOESNT_START_WITH:
104
+ return withComposeCode(filterFactory.doesntStartWith)(attribute, conditionFilterJaql[ConditionFilterType.DOESNT_START_WITH]);
105
+ case ConditionFilterType.ENDS_WITH:
106
+ return withComposeCode(filterFactory.endsWith)(attribute, conditionFilterJaql[ConditionFilterType.ENDS_WITH]);
107
+ case ConditionFilterType.DOESNT_END_WITH:
108
+ return withComposeCode(filterFactory.doesntEndWith)(attribute, conditionFilterJaql[ConditionFilterType.DOESNT_END_WITH]);
109
+ case ConditionFilterType.CONTAINS:
110
+ return withComposeCode(filterFactory.contains)(attribute, conditionFilterJaql[ConditionFilterType.CONTAINS]);
111
+ case ConditionFilterType.DOESNT_CONTAIN:
112
+ return withComposeCode(filterFactory.doesntContain)(attribute, conditionFilterJaql[ConditionFilterType.DOESNT_CONTAIN]);
113
+ case ConditionFilterType.LESS_THAN:
114
+ return withComposeCode(filterFactory.lessThan)(attribute, conditionFilterJaql[ConditionFilterType.LESS_THAN]);
115
+ case ConditionFilterType.LESS_THAN_OR_EQUAL:
116
+ return withComposeCode(filterFactory.lessThanOrEqual)(attribute, conditionFilterJaql[ConditionFilterType.LESS_THAN_OR_EQUAL]);
117
+ case ConditionFilterType.BETWEEN:
118
+ return withComposeCode(filterFactory.between)(attribute, conditionFilterJaql.from, conditionFilterJaql.to);
119
+ case ConditionFilterType.IS_NOT_BETWEEN:
120
+ return withComposeCode(filterFactory.exclude)(withComposeCode(filterFactory.between)(attribute, (_a = conditionFilterJaql.exclude) === null || _a === void 0 ? void 0 : _a.from, (_b = conditionFilterJaql.exclude) === null || _b === void 0 ? void 0 : _b.to));
121
+ case ConditionFilterType.MULTIPLE_CONDITION:
122
+ if (conditionFilterJaql.and) {
123
+ return withComposeCode(filterFactory.intersection)(conditionFilterJaql.and.map((c) => createAttributeFilterFromConditionFilterJaql(attribute, c)));
124
+ }
125
+ if (conditionFilterJaql.or) {
126
+ return withComposeCode(filterFactory.union)(conditionFilterJaql.or.map((c) => createAttributeFilterFromConditionFilterJaql(attribute, c)));
127
+ }
128
+ break;
129
+ case ConditionFilterType.AFTER:
130
+ case ConditionFilterType.BEFORE:
131
+ case ConditionFilterType.IS_EMPTY:
132
+ case ConditionFilterType.IS_NOT_EMPTY:
133
+ // TODO Handle these cases later; may need filterFactory function added first
134
+ break;
135
+ }
136
+ throw 'Jaql contains unsupported condition filter: ' + JSON.stringify(conditionFilterJaql);
137
+ };
138
+ /**
139
+ * Creates a measure filter from the provided measure and condition filter JAQL object
140
+ *
141
+ * @param measure - Provided measure
142
+ * @param conditionFilterJaql - Condition filter JAQL object
143
+ * @returns measure filter
144
+ */
145
+ export const createMeasureFilterFromConditionFilterJaql = (measure, conditionFilterJaql) => {
146
+ const conditionType = getSelectedConditionOption(conditionFilterJaql);
147
+ switch (conditionType) {
148
+ case ConditionFilterType.EQUALS:
149
+ return withComposeCode(filterFactory.measureEquals)(measure, conditionFilterJaql[ConditionFilterType.EQUALS]);
150
+ case ConditionFilterType.GREATER_THAN:
151
+ return withComposeCode(filterFactory.measureGreaterThan)(measure, conditionFilterJaql[ConditionFilterType.GREATER_THAN]);
152
+ case ConditionFilterType.GREATER_THAN_OR_EQUAL:
153
+ return withComposeCode(filterFactory.measureGreaterThanOrEqual)(measure, conditionFilterJaql[ConditionFilterType.GREATER_THAN_OR_EQUAL]);
154
+ case ConditionFilterType.LESS_THAN:
155
+ return withComposeCode(filterFactory.measureLessThan)(measure, conditionFilterJaql[ConditionFilterType.LESS_THAN]);
156
+ case ConditionFilterType.LESS_THAN_OR_EQUAL:
157
+ return withComposeCode(filterFactory.measureLessThanOrEqual)(measure, conditionFilterJaql[ConditionFilterType.LESS_THAN_OR_EQUAL]);
158
+ case ConditionFilterType.BETWEEN:
159
+ return withComposeCode(filterFactory.measureBetween)(measure, conditionFilterJaql.from, conditionFilterJaql.to);
160
+ }
161
+ throw 'Jaql contains unsupported condition filter: ' + JSON.stringify(conditionFilterJaql);
162
+ };
@@ -0,0 +1,2 @@
1
+ import { DatetimeLevel } from './types.js';
2
+ export declare const getCorrectTimeLevel: (level?: DatetimeLevel, bucket?: string) => DatetimeLevel;
@@ -0,0 +1,8 @@
1
+ import { DatetimeLevel } from './types.js';
2
+ export const getCorrectTimeLevel = (level, bucket) => {
3
+ let newLevel = level ? level.toLocaleLowerCase() : DatetimeLevel.YEARS;
4
+ if (newLevel === DatetimeLevel.MINUTES && bucket === '60') {
5
+ newLevel = DatetimeLevel.HOURS;
6
+ }
7
+ return newLevel;
8
+ };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Stringifies the argument
3
+ *
4
+ * @param arg - argument to stringify
5
+ * @returns stringified argument
6
+ */
7
+ export declare function stringifyHelper(arg: any): string;
8
+ /**
9
+ * High order function to construct compose code for filter factory functions
10
+ *
11
+ * @param func - filter factory function
12
+ */
13
+ export declare function withComposeCode(func: (...args: any[]) => any): (...args: any[]) => any;