@sisense/sdk-data 1.12.0 → 1.14.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.
- package/dist/cjs/dimensional-model/analytics/factory.js +6 -4
- package/dist/cjs/dimensional-model/attributes.js +20 -1
- package/dist/cjs/dimensional-model/dimensions.d.ts +8 -0
- package/dist/cjs/dimensional-model/dimensions.js +4 -0
- package/dist/cjs/dimensional-model/dimensions.test.js +30 -0
- package/dist/cjs/dimensional-model/filters/factory.d.ts +3 -2
- package/dist/cjs/dimensional-model/filters/factory.js +5 -5
- package/dist/cjs/dimensional-model/filters/factory.test.js +1 -1
- package/dist/cjs/dimensional-model/filters/filters.d.ts +37 -2
- package/dist/cjs/dimensional-model/filters/filters.js +88 -4
- package/dist/cjs/dimensional-model/filters/filters.test.js +16 -0
- package/dist/cjs/dimensional-model/filters/utils/condition-filter-util.js +4 -2
- package/dist/cjs/dimensional-model/filters/utils/filter-code-util.js +5 -1
- package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +10 -1
- package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.js +28 -3
- package/dist/cjs/dimensional-model/filters/utils/filter-from-jaql-util.test.js +80 -15
- package/dist/cjs/dimensional-model/filters/utils/filter-types-util.js +3 -3
- package/dist/cjs/dimensional-model/filters/utils/types.d.ts +6 -0
- package/dist/cjs/dimensional-model/interfaces.d.ts +14 -0
- package/dist/cjs/dimensional-model/types.d.ts +2 -0
- package/dist/cjs/dimensional-model/types.js +4 -0
- package/dist/cjs/interfaces.d.ts +1 -1
- package/dist/cjs/translation/resources/en.js +1 -1
- package/dist/cjs/translation/resources/uk.js +1 -1
- package/dist/cjs/utils.js +6 -2
- package/dist/cjs/utils.test.js +24 -0
- package/dist/dimensional-model/analytics/factory.js +6 -4
- package/dist/dimensional-model/attributes.js +20 -1
- package/dist/dimensional-model/dimensions.d.ts +8 -0
- package/dist/dimensional-model/dimensions.js +4 -0
- package/dist/dimensional-model/filters/factory.d.ts +3 -2
- package/dist/dimensional-model/filters/factory.js +6 -6
- package/dist/dimensional-model/filters/filters.d.ts +37 -2
- package/dist/dimensional-model/filters/filters.js +86 -3
- package/dist/dimensional-model/filters/utils/condition-filter-util.js +4 -2
- package/dist/dimensional-model/filters/utils/filter-code-util.js +5 -1
- package/dist/dimensional-model/filters/utils/filter-from-jaql-util.d.ts +10 -1
- package/dist/dimensional-model/filters/utils/filter-from-jaql-util.js +26 -2
- package/dist/dimensional-model/filters/utils/filter-types-util.js +3 -3
- package/dist/dimensional-model/filters/utils/types.d.ts +6 -0
- package/dist/dimensional-model/interfaces.d.ts +14 -0
- package/dist/dimensional-model/types.d.ts +2 -0
- package/dist/dimensional-model/types.js +4 -0
- package/dist/interfaces.d.ts +1 -1
- package/dist/translation/resources/en.js +1 -1
- package/dist/translation/resources/uk.js +1 -1
- package/dist/utils.js +6 -2
- package/package.json +3 -3
|
@@ -105,8 +105,8 @@ const boxWhiskerIqrOutliers = (target) => {
|
|
|
105
105
|
Attr: target,
|
|
106
106
|
});
|
|
107
107
|
outliersAttrWithInnerFilter.name = `${outliersAttrWithInnerFilter.name} (Outliers)`;
|
|
108
|
-
outliersAttrWithInnerFilter.jaql = () => {
|
|
109
|
-
|
|
108
|
+
outliersAttrWithInnerFilter.jaql = (nested) => {
|
|
109
|
+
const jaql = Object.assign(Object.assign({}, target.jaql(true)), { filter: {
|
|
110
110
|
or: [
|
|
111
111
|
{
|
|
112
112
|
fromNotEqual: outliersMax.jaql(true),
|
|
@@ -116,6 +116,7 @@ const boxWhiskerIqrOutliers = (target) => {
|
|
|
116
116
|
},
|
|
117
117
|
],
|
|
118
118
|
} });
|
|
119
|
+
return nested ? jaql : { jaql };
|
|
119
120
|
};
|
|
120
121
|
return outliersAttrWithInnerFilter;
|
|
121
122
|
};
|
|
@@ -134,8 +135,8 @@ const boxWhiskerStdDevOutliers = (target) => {
|
|
|
134
135
|
const outliersMin = (0, factory_js_1.customFormula)(exports.BOX_WHISKER.OUTLIER_MIN_VALUE_NAME, '(LOWERWHISKERMAX_STDEVP([Attr]), all([Attr]))', {
|
|
135
136
|
Attr: target,
|
|
136
137
|
});
|
|
137
|
-
outliersAttrWithInnerFilter.jaql = () => {
|
|
138
|
-
|
|
138
|
+
outliersAttrWithInnerFilter.jaql = (nested) => {
|
|
139
|
+
const jaql = Object.assign(Object.assign({}, target.jaql(true)), { filter: {
|
|
139
140
|
or: [
|
|
140
141
|
{
|
|
141
142
|
fromNotEqual: outliersMax.jaql(true),
|
|
@@ -145,6 +146,7 @@ const boxWhiskerStdDevOutliers = (target) => {
|
|
|
145
146
|
},
|
|
146
147
|
],
|
|
147
148
|
} });
|
|
149
|
+
return nested ? jaql : { jaql };
|
|
148
150
|
};
|
|
149
151
|
return outliersAttrWithInnerFilter;
|
|
150
152
|
};
|
|
@@ -163,6 +163,7 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
|
|
|
163
163
|
*/
|
|
164
164
|
translateGranularityToJaql() {
|
|
165
165
|
const MINUTES_LEVEL = 'minutes';
|
|
166
|
+
const SECONDS_LEVEL = 'seconds';
|
|
166
167
|
switch (this.granularity) {
|
|
167
168
|
case types_js_1.DateLevels.Years:
|
|
168
169
|
case types_js_1.DateLevels.Quarters:
|
|
@@ -185,6 +186,16 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
|
|
|
185
186
|
dateTimeLevel: MINUTES_LEVEL,
|
|
186
187
|
bucket: '15',
|
|
187
188
|
};
|
|
189
|
+
case types_js_1.DateLevels.Minutes:
|
|
190
|
+
return {
|
|
191
|
+
dateTimeLevel: MINUTES_LEVEL,
|
|
192
|
+
bucket: '1',
|
|
193
|
+
};
|
|
194
|
+
case types_js_1.DateLevels.Seconds:
|
|
195
|
+
return {
|
|
196
|
+
dateTimeLevel: SECONDS_LEVEL,
|
|
197
|
+
bucket: '0',
|
|
198
|
+
};
|
|
188
199
|
case types_js_1.DateLevels.AggHours:
|
|
189
200
|
return {
|
|
190
201
|
level: MINUTES_LEVEL,
|
|
@@ -216,7 +227,7 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
|
|
|
216
227
|
return lvl;
|
|
217
228
|
};
|
|
218
229
|
if (json.dateTimeLevel) {
|
|
219
|
-
if (json.dateTimeLevel !== 'minutes') {
|
|
230
|
+
if (json.dateTimeLevel !== 'minutes' && json.dateTimeLevel !== 'seconds') {
|
|
220
231
|
return returnUnsupported(json.dateTimeLevel);
|
|
221
232
|
}
|
|
222
233
|
switch (json.bucket) {
|
|
@@ -226,6 +237,10 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
|
|
|
226
237
|
return types_js_1.DateLevels.MinutesRoundTo30;
|
|
227
238
|
case '15':
|
|
228
239
|
return types_js_1.DateLevels.MinutesRoundTo15;
|
|
240
|
+
case '1':
|
|
241
|
+
return types_js_1.DateLevels.Minutes;
|
|
242
|
+
case '0':
|
|
243
|
+
return types_js_1.DateLevels.Seconds;
|
|
229
244
|
default:
|
|
230
245
|
return returnUnsupported(json.dateTimeLevel);
|
|
231
246
|
}
|
|
@@ -277,6 +292,10 @@ class DimensionalLevelAttribute extends DimensionalAttribute {
|
|
|
277
292
|
return 'yyyy-MM-dd HH:mm';
|
|
278
293
|
case types_js_1.DateLevels.MinutesRoundTo15:
|
|
279
294
|
return 'yyyy-MM-dd HH:mm';
|
|
295
|
+
case types_js_1.DateLevels.Minutes:
|
|
296
|
+
return 'yyyy-MM-dd HH:mm';
|
|
297
|
+
case types_js_1.DateLevels.Seconds:
|
|
298
|
+
return 'yyyy-MM-dd HH:mm:ss';
|
|
280
299
|
case types_js_1.DateLevels.AggHours:
|
|
281
300
|
return 'HH:mm';
|
|
282
301
|
case types_js_1.DateLevels.AggMinutesRoundTo30:
|
|
@@ -94,6 +94,14 @@ export declare class DimensionalDateDimension extends DimensionalDimension imple
|
|
|
94
94
|
* Minutes (round to 15) level
|
|
95
95
|
*/
|
|
96
96
|
readonly MinutesRoundTo15: LevelAttribute;
|
|
97
|
+
/**
|
|
98
|
+
* Minutes level (for Live Models)
|
|
99
|
+
*/
|
|
100
|
+
readonly Minutes: LevelAttribute;
|
|
101
|
+
/**
|
|
102
|
+
* Seconds level (for Live Models)
|
|
103
|
+
*/
|
|
104
|
+
readonly Seconds: LevelAttribute;
|
|
97
105
|
/**
|
|
98
106
|
* Aggregated Hours level
|
|
99
107
|
*/
|
|
@@ -164,6 +164,8 @@ class DimensionalDateDimension extends DimensionalDimension {
|
|
|
164
164
|
this.Hours = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Hours, expression, types_js_1.DateLevels.Hours, 'yyyy-MM-dd HH:mm');
|
|
165
165
|
this.MinutesRoundTo30 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.MinutesRoundTo30, expression, types_js_1.DateLevels.MinutesRoundTo30, 'yyyy-MM-dd HH:mm');
|
|
166
166
|
this.MinutesRoundTo15 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.MinutesRoundTo15, expression, types_js_1.DateLevels.MinutesRoundTo15, 'yyyy-MM-dd HH:mm');
|
|
167
|
+
this.Minutes = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Minutes, expression, types_js_1.DateLevels.Minutes, 'yyyy-MM-dd HH:mm');
|
|
168
|
+
this.Seconds = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.Seconds, expression, types_js_1.DateLevels.Seconds, 'yyyy-MM-dd HH:mm:ss');
|
|
167
169
|
this.AggHours = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggHours, expression, types_js_1.DateLevels.AggHours, 'HH:mm');
|
|
168
170
|
this.AggMinutesRoundTo30 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggMinutesRoundTo30, expression, types_js_1.DateLevels.AggMinutesRoundTo30, 'HH:mm');
|
|
169
171
|
this.AggMinutesRoundTo15 = new attributes_js_1.DimensionalLevelAttribute(types_js_1.DateLevels.AggMinutesRoundTo15, expression, types_js_1.DateLevels.AggMinutesRoundTo15, 'HH:mm');
|
|
@@ -177,6 +179,8 @@ class DimensionalDateDimension extends DimensionalDimension {
|
|
|
177
179
|
this.Hours,
|
|
178
180
|
this.MinutesRoundTo30,
|
|
179
181
|
this.MinutesRoundTo15,
|
|
182
|
+
this.Minutes,
|
|
183
|
+
this.Seconds,
|
|
180
184
|
this.AggHours,
|
|
181
185
|
this.AggMinutesRoundTo30,
|
|
182
186
|
this.AggMinutesRoundTo15,
|
|
@@ -43,6 +43,36 @@ describe('Dimension jaql preparations', () => {
|
|
|
43
43
|
const jaql = dimension.jaql();
|
|
44
44
|
expect(jaql).toStrictEqual(result);
|
|
45
45
|
});
|
|
46
|
+
it('must prepare jaql for date dimension with "seconds" level', () => {
|
|
47
|
+
const result = {
|
|
48
|
+
jaql: {
|
|
49
|
+
title: 'Seconds',
|
|
50
|
+
dim: '[Commerce.Date (Calendar)]',
|
|
51
|
+
bucket: '0',
|
|
52
|
+
dateTimeLevel: 'seconds',
|
|
53
|
+
datatype: 'datetime',
|
|
54
|
+
},
|
|
55
|
+
format: { mask: { seconds: 'yyyy-MM-dd HH:mm:ss' } },
|
|
56
|
+
};
|
|
57
|
+
const dimension = new dimensions_js_1.DimensionalDateDimension('Date', '[Commerce.Date (Calendar)]');
|
|
58
|
+
const jaql = dimension.Seconds.jaql();
|
|
59
|
+
expect(jaql).toStrictEqual(result);
|
|
60
|
+
});
|
|
61
|
+
it('must prepare jaql for date dimension with "minutes" level', () => {
|
|
62
|
+
const result = {
|
|
63
|
+
jaql: {
|
|
64
|
+
title: 'Minutes',
|
|
65
|
+
dim: '[Commerce.Date (Calendar)]',
|
|
66
|
+
bucket: '1',
|
|
67
|
+
dateTimeLevel: 'minutes',
|
|
68
|
+
datatype: 'datetime',
|
|
69
|
+
},
|
|
70
|
+
format: { mask: { minutes: 'yyyy-MM-dd HH:mm' } },
|
|
71
|
+
};
|
|
72
|
+
const dimension = new dimensions_js_1.DimensionalDateDimension('Date', '[Commerce.Date (Calendar)]');
|
|
73
|
+
const jaql = dimension.Minutes.jaql();
|
|
74
|
+
expect(jaql).toStrictEqual(result);
|
|
75
|
+
});
|
|
46
76
|
it('must handle sort', () => {
|
|
47
77
|
const dimensionAscSort = new dimensions_js_1.DimensionalDimension('Brand', '[Brand.Brand]', [new attributes_js_1.DimensionalAttribute('Brand', '[Brand.Brand]')], [], 'textdimension', '', types_js_1.Sort.Ascending);
|
|
48
78
|
const dimensionDescSort = new dimensions_js_1.DimensionalDimension('Brand', '[Brand.Brand]', [new attributes_js_1.DimensionalAttribute('Brand', '[Brand.Brand]')], [], 'textdimension', '', types_js_1.Sort.Descending);
|
|
@@ -373,10 +373,11 @@ export declare function numeric(attribute: Attribute, operatorA?: string, valueA
|
|
|
373
373
|
* ```
|
|
374
374
|
* @param attribute - Attribute to filter on
|
|
375
375
|
* @param members - Array of member values to filter by
|
|
376
|
+
* @param _deactivatedMembers - [internal] Array of deactivated member values
|
|
376
377
|
* @param guid - Optional GUID for the filter
|
|
377
378
|
* @returns A filter instance
|
|
378
379
|
*/
|
|
379
|
-
export declare function members(attribute: Attribute, members: string[], guid?: string): Filter;
|
|
380
|
+
export declare function members(attribute: Attribute, members: string[], _deactivatedMembers?: string[], guid?: string, backgroundFilter?: Filter): Filter;
|
|
380
381
|
/**
|
|
381
382
|
* Creates a filter to isolate date values starting from and including the given date and level.
|
|
382
383
|
*
|
|
@@ -793,4 +794,4 @@ export declare namespace logic {
|
|
|
793
794
|
* @returns A filter instance
|
|
794
795
|
* @internal
|
|
795
796
|
*/
|
|
796
|
-
export declare function customFilter(jaql: any, guid?: string): Filter;
|
|
797
|
+
export declare function customFilter(attribute: Attribute, jaql: any, guid?: string): Filter;
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.customFilter = exports.logic = exports.bottomRanking = exports.topRanking = exports.measureBetweenNotEqual = exports.measureBetween = exports.measureLessThan = exports.measureLessThanOrEqual = exports.measureGreaterThanOrEqual = exports.measureGreaterThan = exports.measureEquals = exports.measureBase = exports.today = exports.thisQuarter = exports.thisMonth = exports.thisYear = exports.dateRelativeTo = exports.dateRelativeFrom = exports.dateRelative = exports.dateRange = exports.dateTo = exports.dateFrom = exports.members = exports.numeric = exports.betweenNotEqual = exports.between = exports.lessThanOrEqual = exports.lessThan = exports.greaterThanOrEqual = exports.greaterThan = exports.equals = exports.doesntEqual = exports.like = exports.startsWith = exports.endsWith = exports.contains = exports.doesntStartWith = exports.doesntEndWith = exports.doesntContain = exports.exclude = exports.intersection = exports.union = void 0;
|
|
4
4
|
const filters_js_1 = require("./filters.js");
|
|
5
|
-
const filter_from_jaql_util_js_1 = require("./utils/filter-from-jaql-util.js");
|
|
6
5
|
// LOGICAL FILTERS
|
|
7
6
|
/**
|
|
8
7
|
* Creates a filter representing the union of multiple filters on the same attribute. The resulting
|
|
@@ -446,11 +445,12 @@ exports.numeric = numeric;
|
|
|
446
445
|
* ```
|
|
447
446
|
* @param attribute - Attribute to filter on
|
|
448
447
|
* @param members - Array of member values to filter by
|
|
448
|
+
* @param _deactivatedMembers - [internal] Array of deactivated member values
|
|
449
449
|
* @param guid - Optional GUID for the filter
|
|
450
450
|
* @returns A filter instance
|
|
451
451
|
*/
|
|
452
|
-
function members(attribute, members, guid) {
|
|
453
|
-
return new filters_js_1.MembersFilter(attribute, members, guid);
|
|
452
|
+
function members(attribute, members, _deactivatedMembers, guid, backgroundFilter) {
|
|
453
|
+
return new filters_js_1.MembersFilter(attribute, members, _deactivatedMembers, guid, backgroundFilter);
|
|
454
454
|
}
|
|
455
455
|
exports.members = members;
|
|
456
456
|
// DATE FILTERS
|
|
@@ -956,7 +956,7 @@ var logic;
|
|
|
956
956
|
* @returns A filter instance
|
|
957
957
|
* @internal
|
|
958
958
|
*/
|
|
959
|
-
function customFilter(jaql, guid) {
|
|
960
|
-
return (
|
|
959
|
+
function customFilter(attribute, jaql, guid) {
|
|
960
|
+
return new filters_js_1.CustomFilter(attribute, jaql, guid);
|
|
961
961
|
}
|
|
962
962
|
exports.customFilter = customFilter;
|
|
@@ -195,7 +195,7 @@ describe('filterFactory', () => {
|
|
|
195
195
|
expect(f).toHaveProperty('operatorA', filters_js_1.NumericOperators.Equals);
|
|
196
196
|
expect(f).toHaveProperty('valueA', 5);
|
|
197
197
|
});
|
|
198
|
-
test('filterFactory.
|
|
198
|
+
test('filterFactory.members()', () => {
|
|
199
199
|
const f = filterFactory.members(TextDim, ['mem1', 'mem2']);
|
|
200
200
|
expect(f).toBeInstanceOf(filters_js_1.MembersFilter);
|
|
201
201
|
expect(f).toHaveProperty('attribute', TextDim);
|
|
@@ -74,6 +74,7 @@ export declare const FilterTypes: {
|
|
|
74
74
|
date: string;
|
|
75
75
|
relativeDate: string;
|
|
76
76
|
cascading: string;
|
|
77
|
+
advanced: string;
|
|
77
78
|
};
|
|
78
79
|
/**
|
|
79
80
|
* base implementation for filter classes
|
|
@@ -93,12 +94,22 @@ declare abstract class AbstractFilter extends DimensionalElement implements Filt
|
|
|
93
94
|
* Global filter identifier
|
|
94
95
|
*/
|
|
95
96
|
readonly guid: string;
|
|
97
|
+
private _disabled;
|
|
98
|
+
private _locked;
|
|
96
99
|
/**
|
|
97
100
|
* Boolean flag whether the filter is disabled
|
|
98
101
|
*
|
|
99
102
|
* @internal
|
|
100
103
|
*/
|
|
101
|
-
disabled: boolean;
|
|
104
|
+
get disabled(): boolean;
|
|
105
|
+
set disabled(value: boolean);
|
|
106
|
+
/**
|
|
107
|
+
* Boolean flag whether the filter is locked
|
|
108
|
+
*
|
|
109
|
+
* @internal
|
|
110
|
+
*/
|
|
111
|
+
get locked(): boolean;
|
|
112
|
+
set locked(value: boolean);
|
|
102
113
|
constructor(att: Attribute, filterType: string, guid?: string);
|
|
103
114
|
get name(): string;
|
|
104
115
|
/**
|
|
@@ -151,7 +162,11 @@ export declare class LogicalAttributeFilter extends AbstractFilter {
|
|
|
151
162
|
*/
|
|
152
163
|
export declare class MembersFilter extends AbstractFilter {
|
|
153
164
|
readonly members: any[];
|
|
154
|
-
|
|
165
|
+
/** @internal */
|
|
166
|
+
_deactivatedMembers: any[];
|
|
167
|
+
/** @internal */
|
|
168
|
+
backgroundFilter?: Filter;
|
|
169
|
+
constructor(attribute: Attribute, members?: any[], _deactivatedMembers?: any[], guid?: string, backgroundFilter?: Filter);
|
|
155
170
|
/**
|
|
156
171
|
* gets the element's ID
|
|
157
172
|
*/
|
|
@@ -175,6 +190,10 @@ export declare class CascadingFilter extends AbstractFilter {
|
|
|
175
190
|
* gets the element's ID
|
|
176
191
|
*/
|
|
177
192
|
get id(): string;
|
|
193
|
+
get disabled(): boolean;
|
|
194
|
+
set disabled(value: boolean);
|
|
195
|
+
get locked(): boolean;
|
|
196
|
+
set locked(value: boolean);
|
|
178
197
|
/**
|
|
179
198
|
* Gets a serializable representation of the element
|
|
180
199
|
*/
|
|
@@ -313,6 +332,22 @@ export declare class RelativeDateFilter extends AbstractFilter {
|
|
|
313
332
|
*/
|
|
314
333
|
filterJaql(): any;
|
|
315
334
|
}
|
|
335
|
+
/**
|
|
336
|
+
* @internal
|
|
337
|
+
*/
|
|
338
|
+
export declare class CustomFilter extends AbstractFilter {
|
|
339
|
+
readonly jaqlExpression: any;
|
|
340
|
+
constructor(att: Attribute, jaql: any, guid?: string);
|
|
341
|
+
/**
|
|
342
|
+
* gets the element's ID
|
|
343
|
+
*/
|
|
344
|
+
get id(): string;
|
|
345
|
+
/**
|
|
346
|
+
* Gets JAQL representing this Filter instance
|
|
347
|
+
*
|
|
348
|
+
*/
|
|
349
|
+
filterJaql(): any;
|
|
350
|
+
}
|
|
316
351
|
/**
|
|
317
352
|
* @param json - Filter JSON representation
|
|
318
353
|
* @internal
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createFilter = exports.RelativeDateFilter = exports.DateRangeFilter = exports.TextFilter = exports.NumericFilter = exports.RankingFilter = exports.MeasureFilter = exports.DoubleOperatorFilter = exports.ExcludeFilter = exports.CascadingFilter = exports.MembersFilter = exports.LogicalAttributeFilter = exports.FilterTypes = exports.RankingOperators = exports.LogicalOperators = exports.DateOperators = exports.NumericOperators = exports.TextOperators = void 0;
|
|
6
|
+
exports.createFilter = exports.CustomFilter = exports.RelativeDateFilter = exports.DateRangeFilter = exports.TextFilter = exports.NumericFilter = exports.RankingFilter = exports.MeasureFilter = exports.DoubleOperatorFilter = exports.ExcludeFilter = exports.CascadingFilter = exports.MembersFilter = exports.LogicalAttributeFilter = exports.FilterTypes = exports.RankingOperators = exports.LogicalOperators = exports.DateOperators = exports.NumericOperators = exports.TextOperators = void 0;
|
|
7
7
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
8
8
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
9
9
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
@@ -92,6 +92,7 @@ exports.FilterTypes = {
|
|
|
92
92
|
date: 'date',
|
|
93
93
|
relativeDate: 'relativeDate',
|
|
94
94
|
cascading: 'cascading',
|
|
95
|
+
advanced: 'advanced',
|
|
95
96
|
};
|
|
96
97
|
// CLASSES
|
|
97
98
|
/**
|
|
@@ -107,6 +108,29 @@ class AbstractFilter extends base_js_1.DimensionalElement {
|
|
|
107
108
|
this.attribute = att;
|
|
108
109
|
this.guid = guid || (0, utils_js_1.guidFast)(13);
|
|
109
110
|
this.disabled = false;
|
|
111
|
+
this.locked = false;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Boolean flag whether the filter is disabled
|
|
115
|
+
*
|
|
116
|
+
* @internal
|
|
117
|
+
*/
|
|
118
|
+
get disabled() {
|
|
119
|
+
return this._disabled;
|
|
120
|
+
}
|
|
121
|
+
set disabled(value) {
|
|
122
|
+
this._disabled = value;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Boolean flag whether the filter is locked
|
|
126
|
+
*
|
|
127
|
+
* @internal
|
|
128
|
+
*/
|
|
129
|
+
get locked() {
|
|
130
|
+
return this._locked;
|
|
131
|
+
}
|
|
132
|
+
set locked(value) {
|
|
133
|
+
this._locked = value;
|
|
110
134
|
}
|
|
111
135
|
get name() {
|
|
112
136
|
return (0, object_hash_1.default)(this.jaql());
|
|
@@ -149,7 +173,9 @@ class AbstractFilter extends base_js_1.DimensionalElement {
|
|
|
149
173
|
const { granularity } = attribute;
|
|
150
174
|
if (granularity === types_js_1.DateLevels.Hours ||
|
|
151
175
|
granularity === types_js_1.DateLevels.MinutesRoundTo30 ||
|
|
152
|
-
granularity === types_js_1.DateLevels.MinutesRoundTo15
|
|
176
|
+
granularity === types_js_1.DateLevels.MinutesRoundTo15 ||
|
|
177
|
+
granularity === types_js_1.DateLevels.Minutes ||
|
|
178
|
+
granularity === types_js_1.DateLevels.Seconds) {
|
|
153
179
|
throw new translatable_error_js_1.TranslatableError('errors.filter.unsupportedDatetimeLevel');
|
|
154
180
|
}
|
|
155
181
|
}
|
|
@@ -195,9 +221,11 @@ exports.LogicalAttributeFilter = LogicalAttributeFilter;
|
|
|
195
221
|
* @internal
|
|
196
222
|
*/
|
|
197
223
|
class MembersFilter extends AbstractFilter {
|
|
198
|
-
constructor(attribute, members, guid) {
|
|
224
|
+
constructor(attribute, members, _deactivatedMembers, guid, backgroundFilter) {
|
|
199
225
|
super(attribute, exports.FilterTypes.members, guid);
|
|
200
226
|
this.members = members !== null && members !== void 0 ? members : [];
|
|
227
|
+
this._deactivatedMembers = _deactivatedMembers !== null && _deactivatedMembers !== void 0 ? _deactivatedMembers : [];
|
|
228
|
+
this.backgroundFilter = backgroundFilter;
|
|
201
229
|
if (this.members.filter((m) => m === null || m === undefined).length > 0) {
|
|
202
230
|
throw new translatable_error_js_1.TranslatableError('errors.filter.membersFilterNullMember', {
|
|
203
231
|
attributeId: attribute.id,
|
|
@@ -216,15 +244,24 @@ class MembersFilter extends AbstractFilter {
|
|
|
216
244
|
serializable() {
|
|
217
245
|
const result = super.serializable();
|
|
218
246
|
result.members = this.members;
|
|
247
|
+
if (this.backgroundFilter) {
|
|
248
|
+
result.backgroundFilter = this.backgroundFilter.serializable();
|
|
249
|
+
}
|
|
219
250
|
return result;
|
|
220
251
|
}
|
|
221
252
|
/**
|
|
222
253
|
* Gets JAQL representing this Filter instance
|
|
223
254
|
*/
|
|
224
255
|
filterJaql() {
|
|
225
|
-
|
|
256
|
+
const filterJaql = {
|
|
226
257
|
members: this.members.map((m) => m.toString()),
|
|
227
258
|
};
|
|
259
|
+
if (this.backgroundFilter) {
|
|
260
|
+
return {
|
|
261
|
+
and: [filterJaql, this.backgroundFilter.filterJaql()],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
return filterJaql;
|
|
228
265
|
}
|
|
229
266
|
}
|
|
230
267
|
exports.MembersFilter = MembersFilter;
|
|
@@ -242,6 +279,28 @@ class CascadingFilter extends AbstractFilter {
|
|
|
242
279
|
get id() {
|
|
243
280
|
return `${this.filterType}_${this.filters.map((f) => f.id).join()}`;
|
|
244
281
|
}
|
|
282
|
+
get disabled() {
|
|
283
|
+
return super.disabled;
|
|
284
|
+
}
|
|
285
|
+
set disabled(value) {
|
|
286
|
+
super.disabled = value;
|
|
287
|
+
if (this.filters) {
|
|
288
|
+
this.filters.forEach((filter) => {
|
|
289
|
+
filter.disabled = value;
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
get locked() {
|
|
294
|
+
return super.locked;
|
|
295
|
+
}
|
|
296
|
+
set locked(value) {
|
|
297
|
+
super.locked = value;
|
|
298
|
+
if (this.filters) {
|
|
299
|
+
this.filters.forEach((filter) => {
|
|
300
|
+
filter.locked = value;
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
245
304
|
/**
|
|
246
305
|
* Gets a serializable representation of the element
|
|
247
306
|
*/
|
|
@@ -573,6 +632,31 @@ class RelativeDateFilter extends AbstractFilter {
|
|
|
573
632
|
}
|
|
574
633
|
}
|
|
575
634
|
exports.RelativeDateFilter = RelativeDateFilter;
|
|
635
|
+
/**
|
|
636
|
+
* @internal
|
|
637
|
+
*/
|
|
638
|
+
class CustomFilter extends AbstractFilter {
|
|
639
|
+
constructor(att, jaql, guid) {
|
|
640
|
+
super(att, exports.FilterTypes.advanced, guid);
|
|
641
|
+
// remove filterType from jaql as it is not needed
|
|
642
|
+
delete jaql.filterType;
|
|
643
|
+
this.jaqlExpression = jaql;
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* gets the element's ID
|
|
647
|
+
*/
|
|
648
|
+
get id() {
|
|
649
|
+
return `custom_${this.attribute.id}_${this.guid}`;
|
|
650
|
+
}
|
|
651
|
+
/**
|
|
652
|
+
* Gets JAQL representing this Filter instance
|
|
653
|
+
*
|
|
654
|
+
*/
|
|
655
|
+
filterJaql() {
|
|
656
|
+
return this.jaqlExpression;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
exports.CustomFilter = CustomFilter;
|
|
576
660
|
/**
|
|
577
661
|
* @param json - Filter JSON representation
|
|
578
662
|
* @internal
|
|
@@ -206,6 +206,22 @@ describe('Filters jaql preparations', () => {
|
|
|
206
206
|
const jaql = filter.jaql();
|
|
207
207
|
expect(jaql).toStrictEqual(result);
|
|
208
208
|
});
|
|
209
|
+
it('must prepare members filter jaql with inner background filter', () => {
|
|
210
|
+
const result = {
|
|
211
|
+
jaql: {
|
|
212
|
+
title: 'CommerceGender',
|
|
213
|
+
dim: '[Commerce.Gender]',
|
|
214
|
+
datatype: 'text',
|
|
215
|
+
filter: { and: [{ members: ['Female'] }, { members: ['Female', 'Male'] }] },
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
const attribute = new attributes_js_1.DimensionalAttribute('[Commerce.Gender]', '[Commerce.Gender]');
|
|
219
|
+
const backgroundFilter = new filters_js_1.MembersFilter(attribute, ['Female', 'Male']);
|
|
220
|
+
const filter = new filters_js_1.MembersFilter(attribute, ['Female'], undefined, undefined, backgroundFilter);
|
|
221
|
+
expect(filter.backgroundFilter).toBe(backgroundFilter);
|
|
222
|
+
const jaql = filter.jaql();
|
|
223
|
+
expect(jaql).toStrictEqual(result);
|
|
224
|
+
});
|
|
209
225
|
});
|
|
210
226
|
describe('Disabled Filter', () => {
|
|
211
227
|
it('must prepare empty jaql for attribute filter', () => {
|
|
@@ -108,7 +108,7 @@ exports.getSelectedConditionOption = getSelectedConditionOption;
|
|
|
108
108
|
* @returns attribute filter
|
|
109
109
|
*/
|
|
110
110
|
const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilterJaql, guid) => {
|
|
111
|
-
var _a, _b;
|
|
111
|
+
var _a, _b, _c;
|
|
112
112
|
const conditionType = (0, exports.getSelectedConditionOption)(conditionFilterJaql);
|
|
113
113
|
switch (conditionType) {
|
|
114
114
|
case types_js_1.ConditionFilterType.BOTTOM:
|
|
@@ -146,7 +146,7 @@ const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilter
|
|
|
146
146
|
case types_js_1.ConditionFilterType.BETWEEN:
|
|
147
147
|
return (0, filter_code_util_js_1.withComposeCode)(filterFactory.between)(attribute, conditionFilterJaql.from, conditionFilterJaql.to, guid);
|
|
148
148
|
case types_js_1.ConditionFilterType.IS_NOT_BETWEEN:
|
|
149
|
-
return (0, filter_code_util_js_1.withComposeCode)(filterFactory.exclude)((0, filter_code_util_js_1.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, guid));
|
|
149
|
+
return (0, filter_code_util_js_1.withComposeCode)(filterFactory.exclude)((0, filter_code_util_js_1.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, guid), undefined, guid);
|
|
150
150
|
case types_js_1.ConditionFilterType.MULTIPLE_CONDITION:
|
|
151
151
|
if (conditionFilterJaql.and) {
|
|
152
152
|
return (0, filter_code_util_js_1.withComposeCode)(filterFactory.intersection)(conditionFilterJaql.and.map((c) => (0, exports.createAttributeFilterFromConditionFilterJaql)(attribute, c, guid)), guid);
|
|
@@ -155,6 +155,8 @@ const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilter
|
|
|
155
155
|
return (0, filter_code_util_js_1.withComposeCode)(filterFactory.union)(conditionFilterJaql.or.map((c) => (0, exports.createAttributeFilterFromConditionFilterJaql)(attribute, c, guid)), guid);
|
|
156
156
|
}
|
|
157
157
|
break;
|
|
158
|
+
case types_js_1.ConditionFilterType.IS_NOT:
|
|
159
|
+
return (0, filter_code_util_js_1.withComposeCode)(filterFactory.exclude)((0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, ((_c = conditionFilterJaql.exclude) === null || _c === void 0 ? void 0 : _c.members) || [], undefined, guid), undefined, guid);
|
|
158
160
|
case types_js_1.ConditionFilterType.AFTER:
|
|
159
161
|
case types_js_1.ConditionFilterType.BEFORE:
|
|
160
162
|
case types_js_1.ConditionFilterType.IS_EMPTY:
|
|
@@ -44,7 +44,11 @@ exports.stringifyHelper = stringifyHelper;
|
|
|
44
44
|
*/
|
|
45
45
|
function withComposeCode(func) {
|
|
46
46
|
return function (...args) {
|
|
47
|
-
const argValues = args
|
|
47
|
+
const argValues = args
|
|
48
|
+
.map(stringifyHelper)
|
|
49
|
+
.join(', ')
|
|
50
|
+
// remove any number of trailing commas
|
|
51
|
+
.replace(/(,\s*)+$/, '');
|
|
48
52
|
const signature = `filterFactory.${func.name}(${argValues})`;
|
|
49
53
|
const filter = func(...args);
|
|
50
54
|
filter.composeCode = signature;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ConditionFilterJaql, FilterJaqlInternal, PeriodFilterJaql, RangeFilterJaql, SpecificItemsFilterJaql } from './types.js';
|
|
1
|
+
import { BaseFilterJaql, ConditionFilterJaql, FilterJaqlInternal, PeriodFilterJaql, RangeFilterJaql, SpecificItemsFilterJaql } from './types.js';
|
|
2
2
|
import { Attribute, BaseMeasure, Filter, LevelAttribute } from '../../interfaces.js';
|
|
3
3
|
import { FilterJaql } from '../../types.js';
|
|
4
4
|
/**
|
|
@@ -63,6 +63,15 @@ export declare const createFilterFromPeriodFilterJaql: (attribute: LevelAttribut
|
|
|
63
63
|
* @returns Filter object
|
|
64
64
|
*/
|
|
65
65
|
export declare const createFilterFromConditionFilterJaql: (attribute: Attribute, conditionFilterJaql: ConditionFilterJaql, measure?: BaseMeasure, guid?: string) => Filter;
|
|
66
|
+
/**
|
|
67
|
+
* Creates a filter from a custom filter JAQL object.
|
|
68
|
+
*
|
|
69
|
+
* @param attribute - attribute
|
|
70
|
+
* @param customFilterJaql - Custom Filter Jaql
|
|
71
|
+
* @param guid - Optional GUID for the filter
|
|
72
|
+
* @returns Filter object
|
|
73
|
+
*/
|
|
74
|
+
export declare const createFilterFromCustomFilterJaql: (attribute: Attribute, customFilterJaql: BaseFilterJaql, guid?: string) => Filter;
|
|
66
75
|
/**
|
|
67
76
|
* Creates a filter from a filter JAQL object.
|
|
68
77
|
*
|
|
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.createFilterFromJaqlInternal = exports.createFilterFromConditionFilterJaql = exports.createFilterFromPeriodFilterJaql = exports.createFilterFromNumericRangeJaql = exports.createFilterFromDateRangeFilterJaql = exports.createFilterFromSpecificItemsFilterJaql = exports.createFilterIncludeAll = exports.createGenericFilter = void 0;
|
|
26
|
+
exports.createFilterFromJaqlInternal = exports.createFilterFromCustomFilterJaql = exports.createFilterFromConditionFilterJaql = exports.createFilterFromPeriodFilterJaql = exports.createFilterFromNumericRangeJaql = exports.createFilterFromDateRangeFilterJaql = exports.createFilterFromSpecificItemsFilterJaql = exports.createFilterIncludeAll = exports.createGenericFilter = void 0;
|
|
27
27
|
const types_js_1 = require("./types.js");
|
|
28
28
|
const filterFactory = __importStar(require("../factory.js"));
|
|
29
29
|
const condition_filter_util_js_1 = require("./condition-filter-util.js");
|
|
@@ -71,7 +71,7 @@ exports.createGenericFilter = createGenericFilter;
|
|
|
71
71
|
* @returns The created Filter object.
|
|
72
72
|
*/
|
|
73
73
|
const createFilterIncludeAll = (attribute, guid) => {
|
|
74
|
-
return (0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, [], guid);
|
|
74
|
+
return (0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, [], [], guid);
|
|
75
75
|
};
|
|
76
76
|
exports.createFilterIncludeAll = createFilterIncludeAll;
|
|
77
77
|
/**
|
|
@@ -83,9 +83,21 @@ exports.createFilterIncludeAll = createFilterIncludeAll;
|
|
|
83
83
|
* @returns Filter object
|
|
84
84
|
*/
|
|
85
85
|
const createFilterFromSpecificItemsFilterJaql = (attribute, specificItemsFilterJaql, guid) => {
|
|
86
|
-
|
|
86
|
+
const deactivatedMembers = getDeactivatedMembersFromFilterJaql(specificItemsFilterJaql);
|
|
87
|
+
const activeMembers = getActiveMembersFromFilterJaql(specificItemsFilterJaql, deactivatedMembers);
|
|
88
|
+
return (0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, activeMembers, deactivatedMembers, guid);
|
|
87
89
|
};
|
|
88
90
|
exports.createFilterFromSpecificItemsFilterJaql = createFilterFromSpecificItemsFilterJaql;
|
|
91
|
+
function getDeactivatedMembersFromFilterJaql(filterJaql) {
|
|
92
|
+
var _a, _b, _c;
|
|
93
|
+
return ((_a = filterJaql.filter) === null || _a === void 0 ? void 0 : _a.turnedOff) ? (_c = (_b = filterJaql.filter) === null || _b === void 0 ? void 0 : _b.exclude) === null || _c === void 0 ? void 0 : _c.members : undefined;
|
|
94
|
+
}
|
|
95
|
+
function getActiveMembersFromFilterJaql(filterJaql, deactivatedMembers) {
|
|
96
|
+
const allMembers = filterJaql.members;
|
|
97
|
+
return deactivatedMembers
|
|
98
|
+
? allMembers.filter((member) => !deactivatedMembers.includes(member))
|
|
99
|
+
: allMembers;
|
|
100
|
+
}
|
|
89
101
|
/**
|
|
90
102
|
* Creates a filter from a date range filter JAQL object.
|
|
91
103
|
*
|
|
@@ -145,6 +157,18 @@ const createFilterFromConditionFilterJaql = (attribute, conditionFilterJaql, mea
|
|
|
145
157
|
}
|
|
146
158
|
};
|
|
147
159
|
exports.createFilterFromConditionFilterJaql = createFilterFromConditionFilterJaql;
|
|
160
|
+
/**
|
|
161
|
+
* Creates a filter from a custom filter JAQL object.
|
|
162
|
+
*
|
|
163
|
+
* @param attribute - attribute
|
|
164
|
+
* @param customFilterJaql - Custom Filter Jaql
|
|
165
|
+
* @param guid - Optional GUID for the filter
|
|
166
|
+
* @returns Filter object
|
|
167
|
+
*/
|
|
168
|
+
const createFilterFromCustomFilterJaql = (attribute, customFilterJaql, guid) => {
|
|
169
|
+
return (0, filter_code_util_js_1.withComposeCode)(filterFactory.customFilter)(attribute, customFilterJaql, guid);
|
|
170
|
+
};
|
|
171
|
+
exports.createFilterFromCustomFilterJaql = createFilterFromCustomFilterJaql;
|
|
148
172
|
/**
|
|
149
173
|
* Creates a filter from a filter JAQL object.
|
|
150
174
|
*
|
|
@@ -177,6 +201,7 @@ const createFilterFromJaqlInternal = (jaql, guid) => {
|
|
|
177
201
|
case types_js_1.FILTER_TYPES.NUMERIC_RANGE:
|
|
178
202
|
return (0, exports.createFilterFromNumericRangeJaql)(attribute, filterJaqlWithType, guid);
|
|
179
203
|
case types_js_1.FILTER_TYPES.ADVANCED:
|
|
204
|
+
return (0, exports.createFilterFromCustomFilterJaql)(attribute, filterJaqlWithType, guid);
|
|
180
205
|
case types_js_1.FILTER_TYPES.INVALID:
|
|
181
206
|
return (0, exports.createGenericFilter)(jaql, guid);
|
|
182
207
|
}
|