@sisense/sdk-data 1.12.0 → 1.13.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/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 +25 -2
- package/dist/cjs/dimensional-model/filters/filters.js +51 -2
- 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/dimensional-model/analytics/factory.js +6 -4
- 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 +25 -2
- package/dist/dimensional-model/filters/filters.js +49 -1
- 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/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
|
};
|
|
@@ -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): 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) {
|
|
453
|
+
return new filters_js_1.MembersFilter(attribute, members, _deactivatedMembers, guid);
|
|
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,14 @@ declare abstract class AbstractFilter extends DimensionalElement implements Filt
|
|
|
93
94
|
* Global filter identifier
|
|
94
95
|
*/
|
|
95
96
|
readonly guid: string;
|
|
97
|
+
private _disabled;
|
|
96
98
|
/**
|
|
97
99
|
* Boolean flag whether the filter is disabled
|
|
98
100
|
*
|
|
99
101
|
* @internal
|
|
100
102
|
*/
|
|
101
|
-
disabled: boolean;
|
|
103
|
+
get disabled(): boolean;
|
|
104
|
+
set disabled(value: boolean);
|
|
102
105
|
constructor(att: Attribute, filterType: string, guid?: string);
|
|
103
106
|
get name(): string;
|
|
104
107
|
/**
|
|
@@ -151,7 +154,9 @@ export declare class LogicalAttributeFilter extends AbstractFilter {
|
|
|
151
154
|
*/
|
|
152
155
|
export declare class MembersFilter extends AbstractFilter {
|
|
153
156
|
readonly members: any[];
|
|
154
|
-
|
|
157
|
+
/** @internal */
|
|
158
|
+
_deactivatedMembers: any[];
|
|
159
|
+
constructor(attribute: Attribute, members?: any[], _deactivatedMembers?: any[], guid?: string);
|
|
155
160
|
/**
|
|
156
161
|
* gets the element's ID
|
|
157
162
|
*/
|
|
@@ -175,6 +180,8 @@ export declare class CascadingFilter extends AbstractFilter {
|
|
|
175
180
|
* gets the element's ID
|
|
176
181
|
*/
|
|
177
182
|
get id(): string;
|
|
183
|
+
get disabled(): boolean;
|
|
184
|
+
set disabled(value: boolean);
|
|
178
185
|
/**
|
|
179
186
|
* Gets a serializable representation of the element
|
|
180
187
|
*/
|
|
@@ -313,6 +320,22 @@ export declare class RelativeDateFilter extends AbstractFilter {
|
|
|
313
320
|
*/
|
|
314
321
|
filterJaql(): any;
|
|
315
322
|
}
|
|
323
|
+
/**
|
|
324
|
+
* @internal
|
|
325
|
+
*/
|
|
326
|
+
export declare class CustomFilter extends AbstractFilter {
|
|
327
|
+
readonly jaqlExpression: any;
|
|
328
|
+
constructor(att: Attribute, jaql: any, guid?: string);
|
|
329
|
+
/**
|
|
330
|
+
* gets the element's ID
|
|
331
|
+
*/
|
|
332
|
+
get id(): string;
|
|
333
|
+
/**
|
|
334
|
+
* Gets JAQL representing this Filter instance
|
|
335
|
+
*
|
|
336
|
+
*/
|
|
337
|
+
filterJaql(): any;
|
|
338
|
+
}
|
|
316
339
|
/**
|
|
317
340
|
* @param json - Filter JSON representation
|
|
318
341
|
* @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
|
/**
|
|
@@ -108,6 +109,17 @@ class AbstractFilter extends base_js_1.DimensionalElement {
|
|
|
108
109
|
this.guid = guid || (0, utils_js_1.guidFast)(13);
|
|
109
110
|
this.disabled = false;
|
|
110
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Boolean flag whether the filter is disabled
|
|
114
|
+
*
|
|
115
|
+
* @internal
|
|
116
|
+
*/
|
|
117
|
+
get disabled() {
|
|
118
|
+
return this._disabled;
|
|
119
|
+
}
|
|
120
|
+
set disabled(value) {
|
|
121
|
+
this._disabled = value;
|
|
122
|
+
}
|
|
111
123
|
get name() {
|
|
112
124
|
return (0, object_hash_1.default)(this.jaql());
|
|
113
125
|
}
|
|
@@ -195,9 +207,10 @@ exports.LogicalAttributeFilter = LogicalAttributeFilter;
|
|
|
195
207
|
* @internal
|
|
196
208
|
*/
|
|
197
209
|
class MembersFilter extends AbstractFilter {
|
|
198
|
-
constructor(attribute, members, guid) {
|
|
210
|
+
constructor(attribute, members, _deactivatedMembers, guid) {
|
|
199
211
|
super(attribute, exports.FilterTypes.members, guid);
|
|
200
212
|
this.members = members !== null && members !== void 0 ? members : [];
|
|
213
|
+
this._deactivatedMembers = _deactivatedMembers !== null && _deactivatedMembers !== void 0 ? _deactivatedMembers : [];
|
|
201
214
|
if (this.members.filter((m) => m === null || m === undefined).length > 0) {
|
|
202
215
|
throw new translatable_error_js_1.TranslatableError('errors.filter.membersFilterNullMember', {
|
|
203
216
|
attributeId: attribute.id,
|
|
@@ -242,6 +255,17 @@ class CascadingFilter extends AbstractFilter {
|
|
|
242
255
|
get id() {
|
|
243
256
|
return `${this.filterType}_${this.filters.map((f) => f.id).join()}`;
|
|
244
257
|
}
|
|
258
|
+
get disabled() {
|
|
259
|
+
return super.disabled;
|
|
260
|
+
}
|
|
261
|
+
set disabled(value) {
|
|
262
|
+
super.disabled = value;
|
|
263
|
+
if (this.filters) {
|
|
264
|
+
this.filters.forEach((filter) => {
|
|
265
|
+
filter.disabled = value;
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
245
269
|
/**
|
|
246
270
|
* Gets a serializable representation of the element
|
|
247
271
|
*/
|
|
@@ -573,6 +597,31 @@ class RelativeDateFilter extends AbstractFilter {
|
|
|
573
597
|
}
|
|
574
598
|
}
|
|
575
599
|
exports.RelativeDateFilter = RelativeDateFilter;
|
|
600
|
+
/**
|
|
601
|
+
* @internal
|
|
602
|
+
*/
|
|
603
|
+
class CustomFilter extends AbstractFilter {
|
|
604
|
+
constructor(att, jaql, guid) {
|
|
605
|
+
super(att, exports.FilterTypes.advanced, guid);
|
|
606
|
+
// remove filterType from jaql as it is not needed
|
|
607
|
+
delete jaql.filterType;
|
|
608
|
+
this.jaqlExpression = jaql;
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* gets the element's ID
|
|
612
|
+
*/
|
|
613
|
+
get id() {
|
|
614
|
+
return `custom_${this.attribute.id}_${this.guid}`;
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Gets JAQL representing this Filter instance
|
|
618
|
+
*
|
|
619
|
+
*/
|
|
620
|
+
filterJaql() {
|
|
621
|
+
return this.jaqlExpression;
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
exports.CustomFilter = CustomFilter;
|
|
576
625
|
/**
|
|
577
626
|
* @param json - Filter JSON representation
|
|
578
627
|
* @internal
|
|
@@ -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
|
}
|
|
@@ -31,6 +31,8 @@ const filterFactory = __importStar(require("../factory.js"));
|
|
|
31
31
|
const types_js_1 = require("./types.js");
|
|
32
32
|
const attribute_measure_util_js_1 = require("./attribute-measure-util.js");
|
|
33
33
|
const condition_filter_util_js_1 = require("./condition-filter-util.js");
|
|
34
|
+
const filter_from_jaql_util_js_2 = require("./filter-from-jaql-util.js");
|
|
35
|
+
const filter_code_util_js_1 = require("./filter-code-util.js");
|
|
34
36
|
(0, vitest_1.describe)('filter-from-jaql-util', () => {
|
|
35
37
|
(0, vitest_1.describe)('createFilterFromJaqlInternal', () => {
|
|
36
38
|
const guid = 'instanceid';
|
|
@@ -56,7 +58,7 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
|
|
|
56
58
|
};
|
|
57
59
|
const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
|
|
58
60
|
const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
|
|
59
|
-
const expectedFilter = filterFactory.members(attribute, [], guid);
|
|
61
|
+
const expectedFilter = filterFactory.members(attribute, [], [], guid);
|
|
60
62
|
expectEqualFilters(filter, expectedFilter);
|
|
61
63
|
});
|
|
62
64
|
it('should handle members text', () => {
|
|
@@ -74,7 +76,7 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
|
|
|
74
76
|
};
|
|
75
77
|
const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
|
|
76
78
|
const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
|
|
77
|
-
const expectedFilter = filterFactory.members(attribute, jaql.filter.members, guid);
|
|
79
|
+
const expectedFilter = filterFactory.members(attribute, jaql.filter.members, [], guid);
|
|
78
80
|
expectEqualFilters(filter, expectedFilter);
|
|
79
81
|
});
|
|
80
82
|
test('should handle members datetime', () => {
|
|
@@ -116,7 +118,7 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
|
|
|
116
118
|
].forEach((jaql) => {
|
|
117
119
|
const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
|
|
118
120
|
const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
|
|
119
|
-
const expectedFilter = filterFactory.members(attribute, jaql.filter.members, guid);
|
|
121
|
+
const expectedFilter = filterFactory.members(attribute, jaql.filter.members, [], guid);
|
|
120
122
|
expectEqualFilters(filter, expectedFilter);
|
|
121
123
|
});
|
|
122
124
|
});
|
|
@@ -134,7 +136,39 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
|
|
|
134
136
|
};
|
|
135
137
|
const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
|
|
136
138
|
const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
|
|
137
|
-
const expectedFilter = filterFactory.members(attribute, jaql.filter.members, guid);
|
|
139
|
+
const expectedFilter = filterFactory.members(attribute, jaql.filter.members, [], guid);
|
|
140
|
+
expectEqualFilters(filter, expectedFilter);
|
|
141
|
+
});
|
|
142
|
+
it('should handle deactivated members', () => {
|
|
143
|
+
const jaql = {
|
|
144
|
+
datasource: {
|
|
145
|
+
title: 'Sample ECommerce',
|
|
146
|
+
fullname: 'LocalHost/Sample ECommerce',
|
|
147
|
+
id: 'localhost_aSampleIAAaECommerce',
|
|
148
|
+
address: 'LocalHost',
|
|
149
|
+
database: 'aSampleIAAaECommerce',
|
|
150
|
+
},
|
|
151
|
+
column: 'Country',
|
|
152
|
+
dim: '[country.Country]',
|
|
153
|
+
datatype: 'text',
|
|
154
|
+
title: 'COUNTRY',
|
|
155
|
+
collapsed: true,
|
|
156
|
+
isDashboardFilter: true,
|
|
157
|
+
filter: {
|
|
158
|
+
explicit: true,
|
|
159
|
+
multiSelection: true,
|
|
160
|
+
members: ['Albania', 'Algeria', 'Angola'],
|
|
161
|
+
filter: {
|
|
162
|
+
turnedOff: true,
|
|
163
|
+
exclude: {
|
|
164
|
+
members: ['Angola'],
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
|
|
170
|
+
const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
|
|
171
|
+
const expectedFilter = filterFactory.members(attribute, ['Albania', 'Algeria'], ['Angola'], guid);
|
|
138
172
|
expectEqualFilters(filter, expectedFilter);
|
|
139
173
|
});
|
|
140
174
|
});
|
|
@@ -475,19 +509,50 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
|
|
|
475
509
|
});
|
|
476
510
|
});
|
|
477
511
|
});
|
|
512
|
+
(0, vitest_1.describe)('ExcludeFilter', () => {
|
|
513
|
+
it('should handle exclude members', () => {
|
|
514
|
+
const jaql = {
|
|
515
|
+
table: 'Country',
|
|
516
|
+
column: 'Country',
|
|
517
|
+
datatype: 'text',
|
|
518
|
+
title: 'exclude Turkey from Country',
|
|
519
|
+
dim: '[Country.Country]',
|
|
520
|
+
filter: {
|
|
521
|
+
exclude: {
|
|
522
|
+
members: ['Turkey'],
|
|
523
|
+
},
|
|
524
|
+
},
|
|
525
|
+
};
|
|
526
|
+
const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
|
|
527
|
+
const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
|
|
528
|
+
const expectedFilter = filterFactory.exclude((0, filter_code_util_js_1.withComposeCode)(filterFactory.members)(attribute, jaql.filter.exclude.members, undefined, guid), undefined, guid);
|
|
529
|
+
expectEqualFilters(filter, expectedFilter);
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
(0, vitest_1.describe)('Advanced filter (pass-through JAQL)', () => {
|
|
533
|
+
test('should handle', () => {
|
|
534
|
+
const jaql = {
|
|
535
|
+
table: 'Commerce',
|
|
536
|
+
column: 'Revenue',
|
|
537
|
+
datatype: 'numeric',
|
|
538
|
+
title: 'sum Revenue',
|
|
539
|
+
filter: {
|
|
540
|
+
custom: true,
|
|
541
|
+
isAdvanced: true,
|
|
542
|
+
},
|
|
543
|
+
};
|
|
544
|
+
const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
|
|
545
|
+
const attribute = (0, attribute_measure_util_js_1.createAttributeFromFilterJaql)(jaql);
|
|
546
|
+
const expectedFilter = filterFactory.customFilter(attribute, jaql.filter, guid);
|
|
547
|
+
expect(filter.jaql()).toEqual(expectedFilter.jaql());
|
|
548
|
+
expect(filter.jaql(true)).toEqual(expectedFilter.jaql(true));
|
|
549
|
+
expect(filter.serializable()).toBeDefined();
|
|
550
|
+
expect(filter.toJSON()).toBeDefined();
|
|
551
|
+
});
|
|
552
|
+
});
|
|
478
553
|
(0, vitest_1.describe)('Generic filter (pass-through JAQL)', () => {
|
|
479
554
|
test('should fall back to generic filter (pass-through JAQL)', () => {
|
|
480
555
|
[
|
|
481
|
-
// ADVANCED FILTER TYPE
|
|
482
|
-
{
|
|
483
|
-
table: 'Commerce',
|
|
484
|
-
column: 'Revenue',
|
|
485
|
-
datatype: 'numeric',
|
|
486
|
-
title: 'sum Revenue',
|
|
487
|
-
filter: {
|
|
488
|
-
isAdvanced: true,
|
|
489
|
-
},
|
|
490
|
-
},
|
|
491
556
|
// SIMULATE INVALID FILTER TYPE
|
|
492
557
|
{
|
|
493
558
|
table: 'Commerce',
|
|
@@ -546,7 +611,7 @@ const condition_filter_util_js_1 = require("./condition-filter-util.js");
|
|
|
546
611
|
].forEach((item) => {
|
|
547
612
|
const jaql = item;
|
|
548
613
|
const filter = (0, filter_from_jaql_util_js_1.createFilterFromJaqlInternal)(jaql, guid);
|
|
549
|
-
const expectedFilter =
|
|
614
|
+
const expectedFilter = (0, filter_from_jaql_util_js_2.createGenericFilter)(jaql, guid);
|
|
550
615
|
expect(filter.jaql()).toEqual(expectedFilter.jaql());
|
|
551
616
|
expect(filter.jaql(true)).toEqual(expectedFilter.jaql(true));
|
|
552
617
|
expect(filter.serializable()).toBeDefined();
|
|
@@ -35,6 +35,8 @@ const isInvalidFilter = (filter) => filter.filterType === types_js_1.FILTER_TYPE
|
|
|
35
35
|
const getFilterType = (filter, dataType = types_js_1.FilterModalType.DATE_TIME, timeData) => {
|
|
36
36
|
if (timeData && isTimeLevelNotSupported(timeData))
|
|
37
37
|
return types_js_1.FILTER_TYPES.ADVANCED;
|
|
38
|
+
if (isAdvancedFilter(filter))
|
|
39
|
+
return types_js_1.FILTER_TYPES.ADVANCED;
|
|
38
40
|
if (isIncludeAllFilter(filter))
|
|
39
41
|
return types_js_1.FILTER_TYPES.INCLUDE_ALL;
|
|
40
42
|
if (isPeriodFilter(filter))
|
|
@@ -47,11 +49,9 @@ const getFilterType = (filter, dataType = types_js_1.FilterModalType.DATE_TIME,
|
|
|
47
49
|
return types_js_1.FILTER_TYPES.NUMERIC_RANGE;
|
|
48
50
|
if ((0, exports.isConditionFilter)(filter))
|
|
49
51
|
return types_js_1.FILTER_TYPES.CONDITION;
|
|
50
|
-
if (isAdvancedFilter(filter))
|
|
51
|
-
return types_js_1.FILTER_TYPES.ADVANCED;
|
|
52
52
|
if (isInvalidFilter(filter))
|
|
53
53
|
return types_js_1.FILTER_TYPES.INVALID;
|
|
54
|
-
return types_js_1.FILTER_TYPES.
|
|
54
|
+
return types_js_1.FILTER_TYPES.INVALID;
|
|
55
55
|
};
|
|
56
56
|
exports.getFilterType = getFilterType;
|
|
57
57
|
/**
|
|
@@ -70,6 +70,12 @@ export declare type FilterMultiSelectJaql = {
|
|
|
70
70
|
multiSelection: boolean;
|
|
71
71
|
members: string[];
|
|
72
72
|
isCondition?: boolean;
|
|
73
|
+
filter?: {
|
|
74
|
+
turnedOff?: boolean;
|
|
75
|
+
exclude?: {
|
|
76
|
+
members?: string[];
|
|
77
|
+
};
|
|
78
|
+
};
|
|
73
79
|
};
|
|
74
80
|
export declare type FilterMultipleConditionJaql = {
|
|
75
81
|
or: ConditionFilterJaql[];
|
|
@@ -96,8 +96,8 @@ export const boxWhiskerIqrOutliers = (target) => {
|
|
|
96
96
|
Attr: target,
|
|
97
97
|
});
|
|
98
98
|
outliersAttrWithInnerFilter.name = `${outliersAttrWithInnerFilter.name} (Outliers)`;
|
|
99
|
-
outliersAttrWithInnerFilter.jaql = () => {
|
|
100
|
-
|
|
99
|
+
outliersAttrWithInnerFilter.jaql = (nested) => {
|
|
100
|
+
const jaql = Object.assign(Object.assign({}, target.jaql(true)), { filter: {
|
|
101
101
|
or: [
|
|
102
102
|
{
|
|
103
103
|
fromNotEqual: outliersMax.jaql(true),
|
|
@@ -107,6 +107,7 @@ export const boxWhiskerIqrOutliers = (target) => {
|
|
|
107
107
|
},
|
|
108
108
|
],
|
|
109
109
|
} });
|
|
110
|
+
return nested ? jaql : { jaql };
|
|
110
111
|
};
|
|
111
112
|
return outliersAttrWithInnerFilter;
|
|
112
113
|
};
|
|
@@ -124,8 +125,8 @@ export const boxWhiskerStdDevOutliers = (target) => {
|
|
|
124
125
|
const outliersMin = customFormula(BOX_WHISKER.OUTLIER_MIN_VALUE_NAME, '(LOWERWHISKERMAX_STDEVP([Attr]), all([Attr]))', {
|
|
125
126
|
Attr: target,
|
|
126
127
|
});
|
|
127
|
-
outliersAttrWithInnerFilter.jaql = () => {
|
|
128
|
-
|
|
128
|
+
outliersAttrWithInnerFilter.jaql = (nested) => {
|
|
129
|
+
const jaql = Object.assign(Object.assign({}, target.jaql(true)), { filter: {
|
|
129
130
|
or: [
|
|
130
131
|
{
|
|
131
132
|
fromNotEqual: outliersMax.jaql(true),
|
|
@@ -135,6 +136,7 @@ export const boxWhiskerStdDevOutliers = (target) => {
|
|
|
135
136
|
},
|
|
136
137
|
],
|
|
137
138
|
} });
|
|
139
|
+
return nested ? jaql : { jaql };
|
|
138
140
|
};
|
|
139
141
|
return outliersAttrWithInnerFilter;
|
|
140
142
|
};
|
|
@@ -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): 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;
|
|
@@ -1,5 +1,4 @@
|
|
|
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';
|
|
1
|
+
import { TextOperators, NumericOperators, DateOperators, LogicalOperators, RankingOperators, LogicalAttributeFilter, MembersFilter, ExcludeFilter, NumericFilter, MeasureFilter, RankingFilter, TextFilter, DateRangeFilter, RelativeDateFilter, CustomFilter, } from './filters.js';
|
|
3
2
|
// LOGICAL FILTERS
|
|
4
3
|
/**
|
|
5
4
|
* Creates a filter representing the union of multiple filters on the same attribute. The resulting
|
|
@@ -424,11 +423,12 @@ export function numeric(attribute, operatorA, valueA, operatorB, valueB, guid) {
|
|
|
424
423
|
* ```
|
|
425
424
|
* @param attribute - Attribute to filter on
|
|
426
425
|
* @param members - Array of member values to filter by
|
|
426
|
+
* @param _deactivatedMembers - [internal] Array of deactivated member values
|
|
427
427
|
* @param guid - Optional GUID for the filter
|
|
428
428
|
* @returns A filter instance
|
|
429
429
|
*/
|
|
430
|
-
export function members(attribute, members, guid) {
|
|
431
|
-
return new MembersFilter(attribute, members, guid);
|
|
430
|
+
export function members(attribute, members, _deactivatedMembers, guid) {
|
|
431
|
+
return new MembersFilter(attribute, members, _deactivatedMembers, guid);
|
|
432
432
|
}
|
|
433
433
|
// DATE FILTERS
|
|
434
434
|
/**
|
|
@@ -913,6 +913,6 @@ export var logic;
|
|
|
913
913
|
* @returns A filter instance
|
|
914
914
|
* @internal
|
|
915
915
|
*/
|
|
916
|
-
export function customFilter(jaql, guid) {
|
|
917
|
-
return
|
|
916
|
+
export function customFilter(attribute, jaql, guid) {
|
|
917
|
+
return new CustomFilter(attribute, jaql, guid);
|
|
918
918
|
}
|
|
@@ -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,14 @@ declare abstract class AbstractFilter extends DimensionalElement implements Filt
|
|
|
93
94
|
* Global filter identifier
|
|
94
95
|
*/
|
|
95
96
|
readonly guid: string;
|
|
97
|
+
private _disabled;
|
|
96
98
|
/**
|
|
97
99
|
* Boolean flag whether the filter is disabled
|
|
98
100
|
*
|
|
99
101
|
* @internal
|
|
100
102
|
*/
|
|
101
|
-
disabled: boolean;
|
|
103
|
+
get disabled(): boolean;
|
|
104
|
+
set disabled(value: boolean);
|
|
102
105
|
constructor(att: Attribute, filterType: string, guid?: string);
|
|
103
106
|
get name(): string;
|
|
104
107
|
/**
|
|
@@ -151,7 +154,9 @@ export declare class LogicalAttributeFilter extends AbstractFilter {
|
|
|
151
154
|
*/
|
|
152
155
|
export declare class MembersFilter extends AbstractFilter {
|
|
153
156
|
readonly members: any[];
|
|
154
|
-
|
|
157
|
+
/** @internal */
|
|
158
|
+
_deactivatedMembers: any[];
|
|
159
|
+
constructor(attribute: Attribute, members?: any[], _deactivatedMembers?: any[], guid?: string);
|
|
155
160
|
/**
|
|
156
161
|
* gets the element's ID
|
|
157
162
|
*/
|
|
@@ -175,6 +180,8 @@ export declare class CascadingFilter extends AbstractFilter {
|
|
|
175
180
|
* gets the element's ID
|
|
176
181
|
*/
|
|
177
182
|
get id(): string;
|
|
183
|
+
get disabled(): boolean;
|
|
184
|
+
set disabled(value: boolean);
|
|
178
185
|
/**
|
|
179
186
|
* Gets a serializable representation of the element
|
|
180
187
|
*/
|
|
@@ -313,6 +320,22 @@ export declare class RelativeDateFilter extends AbstractFilter {
|
|
|
313
320
|
*/
|
|
314
321
|
filterJaql(): any;
|
|
315
322
|
}
|
|
323
|
+
/**
|
|
324
|
+
* @internal
|
|
325
|
+
*/
|
|
326
|
+
export declare class CustomFilter extends AbstractFilter {
|
|
327
|
+
readonly jaqlExpression: any;
|
|
328
|
+
constructor(att: Attribute, jaql: any, guid?: string);
|
|
329
|
+
/**
|
|
330
|
+
* gets the element's ID
|
|
331
|
+
*/
|
|
332
|
+
get id(): string;
|
|
333
|
+
/**
|
|
334
|
+
* Gets JAQL representing this Filter instance
|
|
335
|
+
*
|
|
336
|
+
*/
|
|
337
|
+
filterJaql(): any;
|
|
338
|
+
}
|
|
316
339
|
/**
|
|
317
340
|
* @param json - Filter JSON representation
|
|
318
341
|
* @internal
|
|
@@ -86,6 +86,7 @@ export const FilterTypes = {
|
|
|
86
86
|
date: 'date',
|
|
87
87
|
relativeDate: 'relativeDate',
|
|
88
88
|
cascading: 'cascading',
|
|
89
|
+
advanced: 'advanced',
|
|
89
90
|
};
|
|
90
91
|
// CLASSES
|
|
91
92
|
/**
|
|
@@ -102,6 +103,17 @@ class AbstractFilter extends DimensionalElement {
|
|
|
102
103
|
this.guid = guid || guidFast(13);
|
|
103
104
|
this.disabled = false;
|
|
104
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Boolean flag whether the filter is disabled
|
|
108
|
+
*
|
|
109
|
+
* @internal
|
|
110
|
+
*/
|
|
111
|
+
get disabled() {
|
|
112
|
+
return this._disabled;
|
|
113
|
+
}
|
|
114
|
+
set disabled(value) {
|
|
115
|
+
this._disabled = value;
|
|
116
|
+
}
|
|
105
117
|
get name() {
|
|
106
118
|
return hash(this.jaql());
|
|
107
119
|
}
|
|
@@ -188,9 +200,10 @@ export class LogicalAttributeFilter extends AbstractFilter {
|
|
|
188
200
|
* @internal
|
|
189
201
|
*/
|
|
190
202
|
export class MembersFilter extends AbstractFilter {
|
|
191
|
-
constructor(attribute, members, guid) {
|
|
203
|
+
constructor(attribute, members, _deactivatedMembers, guid) {
|
|
192
204
|
super(attribute, FilterTypes.members, guid);
|
|
193
205
|
this.members = members !== null && members !== void 0 ? members : [];
|
|
206
|
+
this._deactivatedMembers = _deactivatedMembers !== null && _deactivatedMembers !== void 0 ? _deactivatedMembers : [];
|
|
194
207
|
if (this.members.filter((m) => m === null || m === undefined).length > 0) {
|
|
195
208
|
throw new TranslatableError('errors.filter.membersFilterNullMember', {
|
|
196
209
|
attributeId: attribute.id,
|
|
@@ -234,6 +247,17 @@ export class CascadingFilter extends AbstractFilter {
|
|
|
234
247
|
get id() {
|
|
235
248
|
return `${this.filterType}_${this.filters.map((f) => f.id).join()}`;
|
|
236
249
|
}
|
|
250
|
+
get disabled() {
|
|
251
|
+
return super.disabled;
|
|
252
|
+
}
|
|
253
|
+
set disabled(value) {
|
|
254
|
+
super.disabled = value;
|
|
255
|
+
if (this.filters) {
|
|
256
|
+
this.filters.forEach((filter) => {
|
|
257
|
+
filter.disabled = value;
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
237
261
|
/**
|
|
238
262
|
* Gets a serializable representation of the element
|
|
239
263
|
*/
|
|
@@ -556,6 +580,30 @@ export class RelativeDateFilter extends AbstractFilter {
|
|
|
556
580
|
return result;
|
|
557
581
|
}
|
|
558
582
|
}
|
|
583
|
+
/**
|
|
584
|
+
* @internal
|
|
585
|
+
*/
|
|
586
|
+
export class CustomFilter extends AbstractFilter {
|
|
587
|
+
constructor(att, jaql, guid) {
|
|
588
|
+
super(att, FilterTypes.advanced, guid);
|
|
589
|
+
// remove filterType from jaql as it is not needed
|
|
590
|
+
delete jaql.filterType;
|
|
591
|
+
this.jaqlExpression = jaql;
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* gets the element's ID
|
|
595
|
+
*/
|
|
596
|
+
get id() {
|
|
597
|
+
return `custom_${this.attribute.id}_${this.guid}`;
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Gets JAQL representing this Filter instance
|
|
601
|
+
*
|
|
602
|
+
*/
|
|
603
|
+
filterJaql() {
|
|
604
|
+
return this.jaqlExpression;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
559
607
|
/**
|
|
560
608
|
* @param json - Filter JSON representation
|
|
561
609
|
* @internal
|
|
@@ -81,7 +81,7 @@ export const getSelectedConditionOption = (filter) => {
|
|
|
81
81
|
* @returns attribute filter
|
|
82
82
|
*/
|
|
83
83
|
export const createAttributeFilterFromConditionFilterJaql = (attribute, conditionFilterJaql, guid) => {
|
|
84
|
-
var _a, _b;
|
|
84
|
+
var _a, _b, _c;
|
|
85
85
|
const conditionType = getSelectedConditionOption(conditionFilterJaql);
|
|
86
86
|
switch (conditionType) {
|
|
87
87
|
case ConditionFilterType.BOTTOM:
|
|
@@ -119,7 +119,7 @@ export const createAttributeFilterFromConditionFilterJaql = (attribute, conditio
|
|
|
119
119
|
case ConditionFilterType.BETWEEN:
|
|
120
120
|
return withComposeCode(filterFactory.between)(attribute, conditionFilterJaql.from, conditionFilterJaql.to, guid);
|
|
121
121
|
case ConditionFilterType.IS_NOT_BETWEEN:
|
|
122
|
-
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, guid));
|
|
122
|
+
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, guid), undefined, guid);
|
|
123
123
|
case ConditionFilterType.MULTIPLE_CONDITION:
|
|
124
124
|
if (conditionFilterJaql.and) {
|
|
125
125
|
return withComposeCode(filterFactory.intersection)(conditionFilterJaql.and.map((c) => createAttributeFilterFromConditionFilterJaql(attribute, c, guid)), guid);
|
|
@@ -128,6 +128,8 @@ export const createAttributeFilterFromConditionFilterJaql = (attribute, conditio
|
|
|
128
128
|
return withComposeCode(filterFactory.union)(conditionFilterJaql.or.map((c) => createAttributeFilterFromConditionFilterJaql(attribute, c, guid)), guid);
|
|
129
129
|
}
|
|
130
130
|
break;
|
|
131
|
+
case ConditionFilterType.IS_NOT:
|
|
132
|
+
return withComposeCode(filterFactory.exclude)(withComposeCode(filterFactory.members)(attribute, ((_c = conditionFilterJaql.exclude) === null || _c === void 0 ? void 0 : _c.members) || [], undefined, guid), undefined, guid);
|
|
131
133
|
case ConditionFilterType.AFTER:
|
|
132
134
|
case ConditionFilterType.BEFORE:
|
|
133
135
|
case ConditionFilterType.IS_EMPTY:
|
|
@@ -40,7 +40,11 @@ export function stringifyHelper(arg) {
|
|
|
40
40
|
*/
|
|
41
41
|
export function withComposeCode(func) {
|
|
42
42
|
return function (...args) {
|
|
43
|
-
const argValues = args
|
|
43
|
+
const argValues = args
|
|
44
|
+
.map(stringifyHelper)
|
|
45
|
+
.join(', ')
|
|
46
|
+
// remove any number of trailing commas
|
|
47
|
+
.replace(/(,\s*)+$/, '');
|
|
44
48
|
const signature = `filterFactory.${func.name}(${argValues})`;
|
|
45
49
|
const filter = func(...args);
|
|
46
50
|
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
|
*
|
|
@@ -44,7 +44,7 @@ export const createGenericFilter = (jaql, guid) => {
|
|
|
44
44
|
* @returns The created Filter object.
|
|
45
45
|
*/
|
|
46
46
|
export const createFilterIncludeAll = (attribute, guid) => {
|
|
47
|
-
return withComposeCode(filterFactory.members)(attribute, [], guid);
|
|
47
|
+
return withComposeCode(filterFactory.members)(attribute, [], [], guid);
|
|
48
48
|
};
|
|
49
49
|
/**
|
|
50
50
|
* Creates a filter from a specific items filter JAQL object.
|
|
@@ -55,8 +55,20 @@ export const createFilterIncludeAll = (attribute, guid) => {
|
|
|
55
55
|
* @returns Filter object
|
|
56
56
|
*/
|
|
57
57
|
export const createFilterFromSpecificItemsFilterJaql = (attribute, specificItemsFilterJaql, guid) => {
|
|
58
|
-
|
|
58
|
+
const deactivatedMembers = getDeactivatedMembersFromFilterJaql(specificItemsFilterJaql);
|
|
59
|
+
const activeMembers = getActiveMembersFromFilterJaql(specificItemsFilterJaql, deactivatedMembers);
|
|
60
|
+
return withComposeCode(filterFactory.members)(attribute, activeMembers, deactivatedMembers, guid);
|
|
59
61
|
};
|
|
62
|
+
function getDeactivatedMembersFromFilterJaql(filterJaql) {
|
|
63
|
+
var _a, _b, _c;
|
|
64
|
+
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;
|
|
65
|
+
}
|
|
66
|
+
function getActiveMembersFromFilterJaql(filterJaql, deactivatedMembers) {
|
|
67
|
+
const allMembers = filterJaql.members;
|
|
68
|
+
return deactivatedMembers
|
|
69
|
+
? allMembers.filter((member) => !deactivatedMembers.includes(member))
|
|
70
|
+
: allMembers;
|
|
71
|
+
}
|
|
60
72
|
/**
|
|
61
73
|
* Creates a filter from a date range filter JAQL object.
|
|
62
74
|
*
|
|
@@ -112,6 +124,17 @@ export const createFilterFromConditionFilterJaql = (attribute, conditionFilterJa
|
|
|
112
124
|
return createAttributeFilterFromConditionFilterJaql(attribute, conditionFilterJaql, guid);
|
|
113
125
|
}
|
|
114
126
|
};
|
|
127
|
+
/**
|
|
128
|
+
* Creates a filter from a custom filter JAQL object.
|
|
129
|
+
*
|
|
130
|
+
* @param attribute - attribute
|
|
131
|
+
* @param customFilterJaql - Custom Filter Jaql
|
|
132
|
+
* @param guid - Optional GUID for the filter
|
|
133
|
+
* @returns Filter object
|
|
134
|
+
*/
|
|
135
|
+
export const createFilterFromCustomFilterJaql = (attribute, customFilterJaql, guid) => {
|
|
136
|
+
return withComposeCode(filterFactory.customFilter)(attribute, customFilterJaql, guid);
|
|
137
|
+
};
|
|
115
138
|
/**
|
|
116
139
|
* Creates a filter from a filter JAQL object.
|
|
117
140
|
*
|
|
@@ -144,6 +167,7 @@ export const createFilterFromJaqlInternal = (jaql, guid) => {
|
|
|
144
167
|
case FILTER_TYPES.NUMERIC_RANGE:
|
|
145
168
|
return createFilterFromNumericRangeJaql(attribute, filterJaqlWithType, guid);
|
|
146
169
|
case FILTER_TYPES.ADVANCED:
|
|
170
|
+
return createFilterFromCustomFilterJaql(attribute, filterJaqlWithType, guid);
|
|
147
171
|
case FILTER_TYPES.INVALID:
|
|
148
172
|
return createGenericFilter(jaql, guid);
|
|
149
173
|
}
|
|
@@ -29,6 +29,8 @@ const isInvalidFilter = (filter) => filter.filterType === FILTER_TYPES.INVALID;
|
|
|
29
29
|
export const getFilterType = (filter, dataType = FilterModalType.DATE_TIME, timeData) => {
|
|
30
30
|
if (timeData && isTimeLevelNotSupported(timeData))
|
|
31
31
|
return FILTER_TYPES.ADVANCED;
|
|
32
|
+
if (isAdvancedFilter(filter))
|
|
33
|
+
return FILTER_TYPES.ADVANCED;
|
|
32
34
|
if (isIncludeAllFilter(filter))
|
|
33
35
|
return FILTER_TYPES.INCLUDE_ALL;
|
|
34
36
|
if (isPeriodFilter(filter))
|
|
@@ -41,11 +43,9 @@ export const getFilterType = (filter, dataType = FilterModalType.DATE_TIME, time
|
|
|
41
43
|
return FILTER_TYPES.NUMERIC_RANGE;
|
|
42
44
|
if (isConditionFilter(filter))
|
|
43
45
|
return FILTER_TYPES.CONDITION;
|
|
44
|
-
if (isAdvancedFilter(filter))
|
|
45
|
-
return FILTER_TYPES.ADVANCED;
|
|
46
46
|
if (isInvalidFilter(filter))
|
|
47
47
|
return FILTER_TYPES.INVALID;
|
|
48
|
-
return FILTER_TYPES.
|
|
48
|
+
return FILTER_TYPES.INVALID;
|
|
49
49
|
};
|
|
50
50
|
/**
|
|
51
51
|
* Extracts Filter Type from Filter Jaql
|
|
@@ -70,6 +70,12 @@ export declare type FilterMultiSelectJaql = {
|
|
|
70
70
|
multiSelection: boolean;
|
|
71
71
|
members: string[];
|
|
72
72
|
isCondition?: boolean;
|
|
73
|
+
filter?: {
|
|
74
|
+
turnedOff?: boolean;
|
|
75
|
+
exclude?: {
|
|
76
|
+
members?: string[];
|
|
77
|
+
};
|
|
78
|
+
};
|
|
73
79
|
};
|
|
74
80
|
export declare type FilterMultipleConditionJaql = {
|
|
75
81
|
or: ConditionFilterJaql[];
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"Sisense",
|
|
12
12
|
"Compose SDK"
|
|
13
13
|
],
|
|
14
|
-
"version": "1.
|
|
14
|
+
"version": "1.13.0",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"main": "./dist/cjs/index.js",
|
|
17
17
|
"module": "./dist/index.js",
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
"author": "Sisense",
|
|
33
33
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@sisense/sdk-common": "^1.
|
|
36
|
-
"@sisense/sdk-rest-client": "^1.
|
|
35
|
+
"@sisense/sdk-common": "^1.13.0",
|
|
36
|
+
"@sisense/sdk-rest-client": "^1.13.0",
|
|
37
37
|
"guid-typescript": "^1.0.9",
|
|
38
38
|
"lodash": "^4.17.21",
|
|
39
39
|
"numeral": "^2.0.6",
|