@vuu-ui/vuu-filter-parser 0.13.114 → 0.13.115-alpha.2
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.
|
@@ -1,73 +1,145 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
3
4
|
var FilterParser = require('./FilterParser.js');
|
|
4
5
|
|
|
5
6
|
const filterPredicateMap = /* @__PURE__ */ new Map();
|
|
7
|
+
const dataRowFilterPredicateMap = /* @__PURE__ */ new Map();
|
|
6
8
|
const filterReject = () => false;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
9
|
+
function getFilterPredicate(columnMapOrFilter, filterQuery) {
|
|
10
|
+
if (typeof columnMapOrFilter === "string") {
|
|
11
|
+
let predicate = dataRowFilterPredicateMap.get(columnMapOrFilter);
|
|
12
|
+
if (predicate) {
|
|
13
|
+
return predicate;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const filter = FilterParser.parseFilter(columnMapOrFilter);
|
|
17
|
+
predicate = filterPredicate(filter);
|
|
18
|
+
dataRowFilterPredicateMap.set(columnMapOrFilter, predicate);
|
|
19
|
+
return predicate;
|
|
20
|
+
} catch (err) {
|
|
21
|
+
console.warn(
|
|
22
|
+
`filter-evaluation-utils, failed to parse filter "${filterQuery}"`
|
|
23
|
+
);
|
|
24
|
+
return filterReject;
|
|
25
|
+
}
|
|
26
|
+
} else if (filterQuery) {
|
|
27
|
+
let predicate = filterPredicateMap.get(filterQuery);
|
|
28
|
+
if (predicate) {
|
|
29
|
+
return predicate;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const filter = FilterParser.parseFilter(filterQuery);
|
|
33
|
+
predicate = filterPredicate(columnMapOrFilter, filter);
|
|
34
|
+
filterPredicateMap.set(filterQuery, predicate);
|
|
35
|
+
return predicate;
|
|
36
|
+
} catch (err) {
|
|
37
|
+
console.warn(
|
|
38
|
+
`filter-evaluation-utils, failed to parse filter "${filterQuery}"`
|
|
39
|
+
);
|
|
40
|
+
return filterReject;
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
throw Error(`[getFilterPredicate] invalid params`);
|
|
22
44
|
}
|
|
23
|
-
}
|
|
24
|
-
function filterPredicate(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
}
|
|
46
|
+
function filterPredicate(columnMapOrFilter, filter) {
|
|
47
|
+
if (vuuUtils.isFilter(columnMapOrFilter)) {
|
|
48
|
+
switch (columnMapOrFilter.op) {
|
|
49
|
+
case "in":
|
|
50
|
+
return testDataRowInclude(columnMapOrFilter);
|
|
51
|
+
case "=":
|
|
52
|
+
return testDataRowEQ(columnMapOrFilter);
|
|
53
|
+
case ">":
|
|
54
|
+
return testDataRowGT(columnMapOrFilter);
|
|
55
|
+
case ">=":
|
|
56
|
+
return testDataRowGE(columnMapOrFilter);
|
|
57
|
+
case "<":
|
|
58
|
+
return testDataRowLT(columnMapOrFilter);
|
|
59
|
+
case "<=":
|
|
60
|
+
return testDataRowLE(columnMapOrFilter);
|
|
61
|
+
case "ends":
|
|
62
|
+
return testDataRowEW(columnMapOrFilter);
|
|
63
|
+
case "starts":
|
|
64
|
+
return testDataRowSW(columnMapOrFilter);
|
|
65
|
+
case "contains":
|
|
66
|
+
return testDataRowContains(columnMapOrFilter);
|
|
67
|
+
case "and":
|
|
68
|
+
return testDataRowAND(columnMapOrFilter);
|
|
69
|
+
case "or":
|
|
70
|
+
return testDataRowOR(columnMapOrFilter);
|
|
71
|
+
default:
|
|
72
|
+
console.log(`unrecognized filter type ${columnMapOrFilter.op}`);
|
|
73
|
+
return () => true;
|
|
74
|
+
}
|
|
75
|
+
} else if (filter) {
|
|
76
|
+
switch (filter.op) {
|
|
77
|
+
case "in":
|
|
78
|
+
return testInclude(columnMapOrFilter, filter);
|
|
79
|
+
case "=":
|
|
80
|
+
return testEQ(columnMapOrFilter, filter);
|
|
81
|
+
case ">":
|
|
82
|
+
return testGT(columnMapOrFilter, filter);
|
|
83
|
+
case ">=":
|
|
84
|
+
return testGE(columnMapOrFilter, filter);
|
|
85
|
+
case "<":
|
|
86
|
+
return testLT(columnMapOrFilter, filter);
|
|
87
|
+
case "<=":
|
|
88
|
+
return testLE(columnMapOrFilter, filter);
|
|
89
|
+
case "ends":
|
|
90
|
+
return testEW(columnMapOrFilter, filter);
|
|
91
|
+
case "starts":
|
|
92
|
+
return testSW(columnMapOrFilter, filter);
|
|
93
|
+
case "contains":
|
|
94
|
+
return testContains(columnMapOrFilter, filter);
|
|
95
|
+
case "and":
|
|
96
|
+
return testAND(columnMapOrFilter, filter);
|
|
97
|
+
case "or":
|
|
98
|
+
return testOR(columnMapOrFilter, filter);
|
|
99
|
+
default:
|
|
100
|
+
console.log(`unrecognized filter type ${filter.op}`);
|
|
101
|
+
return () => true;
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
throw Error(`[filterPredicate] invalid params`);
|
|
51
105
|
}
|
|
52
106
|
}
|
|
53
107
|
const testInclude = (columnMap, filter) => {
|
|
54
108
|
return (row) => filter.values.indexOf(row[columnMap[filter.column]]) !== -1;
|
|
55
109
|
};
|
|
110
|
+
const testDataRowInclude = (filter) => {
|
|
111
|
+
return (row) => filter.values.indexOf(row[filter.column]) !== -1;
|
|
112
|
+
};
|
|
56
113
|
const testEQ = (columnMap, filter) => {
|
|
57
114
|
return (row) => row[columnMap[filter.column]] === filter.value;
|
|
58
115
|
};
|
|
116
|
+
const testDataRowEQ = (filter) => {
|
|
117
|
+
return (row) => row[filter.column] === filter.value;
|
|
118
|
+
};
|
|
59
119
|
const testGT = (columnMap, filter) => {
|
|
60
120
|
return (row) => row[columnMap[filter.column]] > filter.value;
|
|
61
121
|
};
|
|
122
|
+
const testDataRowGT = (filter) => {
|
|
123
|
+
return (row) => row[filter.column] > filter.value;
|
|
124
|
+
};
|
|
62
125
|
const testGE = (columnMap, filter) => {
|
|
63
126
|
return (row) => row[columnMap[filter.column]] >= filter.value;
|
|
64
127
|
};
|
|
128
|
+
const testDataRowGE = (filter) => {
|
|
129
|
+
return (row) => row[filter.column] >= filter.value;
|
|
130
|
+
};
|
|
65
131
|
const testLT = (columnMap, filter) => {
|
|
66
132
|
return (row) => row[columnMap[filter.column]] < filter.value;
|
|
67
133
|
};
|
|
134
|
+
const testDataRowLT = (filter) => {
|
|
135
|
+
return (row) => row[filter.column] < filter.value;
|
|
136
|
+
};
|
|
68
137
|
const testLE = (columnMap, filter) => {
|
|
69
138
|
return (row) => row[columnMap[filter.column]] <= filter.value;
|
|
70
139
|
};
|
|
140
|
+
const testDataRowLE = (filter) => {
|
|
141
|
+
return (row) => row[filter.column] <= filter.value;
|
|
142
|
+
};
|
|
71
143
|
const testEW = (columnMap, filter) => {
|
|
72
144
|
const filterValue = filter.value;
|
|
73
145
|
if (typeof filterValue !== "string") {
|
|
@@ -81,6 +153,19 @@ const testEW = (columnMap, filter) => {
|
|
|
81
153
|
return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());
|
|
82
154
|
};
|
|
83
155
|
};
|
|
156
|
+
const testDataRowEW = (filter) => {
|
|
157
|
+
const filterValue = filter.value;
|
|
158
|
+
if (typeof filterValue !== "string") {
|
|
159
|
+
throw Error("string filter applied to value of wrong type");
|
|
160
|
+
}
|
|
161
|
+
return (row) => {
|
|
162
|
+
const rowValue = row[filter.column];
|
|
163
|
+
if (typeof rowValue !== "string") {
|
|
164
|
+
throw Error("string filter applied to value of wrong type");
|
|
165
|
+
}
|
|
166
|
+
return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());
|
|
167
|
+
};
|
|
168
|
+
};
|
|
84
169
|
const testSW = (columnMap, filter) => {
|
|
85
170
|
const filterValue = filter.value;
|
|
86
171
|
if (typeof filterValue !== "string") {
|
|
@@ -94,6 +179,19 @@ const testSW = (columnMap, filter) => {
|
|
|
94
179
|
return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());
|
|
95
180
|
};
|
|
96
181
|
};
|
|
182
|
+
const testDataRowSW = (filter) => {
|
|
183
|
+
const filterValue = filter.value;
|
|
184
|
+
if (typeof filterValue !== "string") {
|
|
185
|
+
throw Error("string filter applied to value of wrong type");
|
|
186
|
+
}
|
|
187
|
+
return (row) => {
|
|
188
|
+
const rowValue = row[filter.column];
|
|
189
|
+
if (typeof rowValue !== "string") {
|
|
190
|
+
throw Error("string filter applied to value of wrong type");
|
|
191
|
+
}
|
|
192
|
+
return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());
|
|
193
|
+
};
|
|
194
|
+
};
|
|
97
195
|
const testContains = (columnMap, filter) => {
|
|
98
196
|
const filterValue = filter.value;
|
|
99
197
|
if (typeof filterValue !== "string") {
|
|
@@ -107,14 +205,35 @@ const testContains = (columnMap, filter) => {
|
|
|
107
205
|
return rowValue.toLowerCase().includes(filterValue.toLowerCase());
|
|
108
206
|
};
|
|
109
207
|
};
|
|
208
|
+
const testDataRowContains = (filter) => {
|
|
209
|
+
const filterValue = filter.value;
|
|
210
|
+
if (typeof filterValue !== "string") {
|
|
211
|
+
throw Error("string filter applied to value of wrong type");
|
|
212
|
+
}
|
|
213
|
+
return (row) => {
|
|
214
|
+
const rowValue = row[filter.column];
|
|
215
|
+
if (typeof rowValue !== "string") {
|
|
216
|
+
throw Error("string filter applied to value of wrong type");
|
|
217
|
+
}
|
|
218
|
+
return rowValue.toLowerCase().includes(filterValue.toLowerCase());
|
|
219
|
+
};
|
|
220
|
+
};
|
|
110
221
|
const testAND = (columnMap, filter) => {
|
|
111
222
|
const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));
|
|
112
223
|
return (row) => filters.every((fn) => fn(row));
|
|
113
224
|
};
|
|
225
|
+
const testDataRowAND = (filter) => {
|
|
226
|
+
const filters = filter.filters.map((f1) => filterPredicate(f1));
|
|
227
|
+
return (row) => filters.every((fn) => fn(row));
|
|
228
|
+
};
|
|
114
229
|
function testOR(columnMap, filter) {
|
|
115
230
|
const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));
|
|
116
231
|
return (row) => filters.some((fn) => fn(row));
|
|
117
232
|
}
|
|
233
|
+
function testDataRowOR(filter) {
|
|
234
|
+
const filters = filter.filters.map((f1) => filterPredicate(f1));
|
|
235
|
+
return (row) => filters.some((fn) => fn(row));
|
|
236
|
+
}
|
|
118
237
|
|
|
119
238
|
exports.filterPredicate = filterPredicate;
|
|
120
239
|
exports.getFilterPredicate = getFilterPredicate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-evaluation-utils.js","sources":["../../../packages/vuu-filter-parser/src/filter-evaluation-utils.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n Filter,\n MultiClauseFilter,\n MultiValueFilterClause,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport { parseFilter } from \"./FilterParser\";\nimport { VuuDataRow } from \"@vuu-ui/vuu-protocol-types\";\n\nconst filterPredicateMap = new Map<string, FilterPredicate>();\nconst filterReject = () => false;\n\nexport const getFilterPredicate = (\n columnMap: ColumnMap,\n filterQuery: string,\n): FilterPredicate => {\n let predicate = filterPredicateMap.get(filterQuery);\n if (predicate) {\n return predicate;\n }\n // TODO we need to clear cache if columns change. How do we identify this :\n try {\n const filter = parseFilter(filterQuery);\n predicate = filterPredicate(columnMap, filter);\n filterPredicateMap.set(filterQuery, predicate);\n return predicate;\n } catch (err) {\n console.warn(\n `filter-evaluation-utils, failed to parse filter \"${filterQuery}\"`,\n );\n return filterReject;\n }\n};\n\nexport function filterPredicate(\n columnMap: ColumnMap,\n filter: Filter,\n): FilterPredicate {\n //TODO convert filter to include colIdx ratherthan colName, so we don't have to pass cols\n switch (filter.op) {\n case \"in\":\n return testInclude(columnMap, filter);\n case \"=\":\n return testEQ(columnMap, filter);\n case \">\":\n return testGT(columnMap, filter);\n case \">=\":\n return testGE(columnMap, filter);\n case \"<\":\n return testLT(columnMap, filter);\n case \"<=\":\n return testLE(columnMap, filter);\n case \"ends\":\n return testEW(columnMap, filter);\n case \"starts\":\n return testSW(columnMap, filter);\n case \"contains\":\n return testContains(columnMap, filter);\n case \"and\":\n return testAND(columnMap, filter as MultiClauseFilter<\"and\">);\n case \"or\":\n return testOR(columnMap, filter as MultiClauseFilter<\"or\">);\n default:\n console.log(`unrecognized filter type ${filter.op}`);\n return () => true;\n }\n}\n\nexport type FilterPredicate = (row: DataSourceRow | VuuDataRow) => boolean;\n\nconst testInclude = (\n columnMap: ColumnMap,\n filter: MultiValueFilterClause,\n): FilterPredicate => {\n return (row) =>\n (filter.values as unknown[]).indexOf(row[columnMap[filter.column]]) !== -1;\n};\n\nconst testEQ = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] === filter.value;\n};\n\nconst testGT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] > filter.value;\n};\nconst testGE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] >= filter.value;\n};\n\nconst testLT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] < filter.value;\n};\nconst testLE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] <= filter.value;\n};\n\nconst testEW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());\n };\n};\n\nconst testSW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());\n };\n};\n\nconst testContains = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().includes(filterValue.toLowerCase());\n };\n};\n\nconst testAND = (\n columnMap: ColumnMap,\n filter: MultiClauseFilter<\"and\">,\n): FilterPredicate => {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.every((fn) => fn(row));\n};\n\nfunction testOR(\n columnMap: ColumnMap,\n filter: MultiClauseFilter<\"or\">,\n): FilterPredicate {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.some((fn) => fn(row));\n}\n"],"names":["parseFilter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-evaluation-utils.js","sources":["../../../packages/vuu-filter-parser/src/filter-evaluation-utils.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n Filter,\n MultiClauseFilter,\n MultiValueFilterClause,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnMap, isFilter } from \"@vuu-ui/vuu-utils\";\nimport { parseFilter } from \"./FilterParser\";\nimport { VuuDataRow } from \"@vuu-ui/vuu-protocol-types\";\nimport { DataRow } from \"@vuu-ui/vuu-table-types\";\n\nconst filterPredicateMap = new Map<string, FilterPredicate>();\nconst dataRowFilterPredicateMap = new Map<string, DataRowFilterPredicate>();\nconst filterReject = () => false;\n\nexport type FilterPredicate = (row: DataSourceRow | VuuDataRow) => boolean;\nexport type DataRowFilterPredicate = (row: DataRow) => boolean;\n\nexport function getFilterPredicate(\n columnMap: ColumnMap,\n filterQuery: string,\n): FilterPredicate;\nexport function getFilterPredicate(filterQuery: string): DataRowFilterPredicate;\nexport function getFilterPredicate(\n columnMapOrFilter: ColumnMap | string,\n filterQuery?: string,\n): FilterPredicate | DataRowFilterPredicate {\n if (typeof columnMapOrFilter === \"string\") {\n let predicate = dataRowFilterPredicateMap.get(columnMapOrFilter);\n if (predicate) {\n return predicate;\n }\n // TODO we need to clear cache if columns change. How do we identify this :\n try {\n const filter = parseFilter(columnMapOrFilter);\n predicate = filterPredicate(filter);\n dataRowFilterPredicateMap.set(columnMapOrFilter, predicate);\n return predicate;\n } catch (err) {\n console.warn(\n `filter-evaluation-utils, failed to parse filter \"${filterQuery}\"`,\n );\n return filterReject;\n }\n } else if (filterQuery) {\n let predicate = filterPredicateMap.get(filterQuery);\n if (predicate) {\n return predicate;\n }\n // TODO we need to clear cache if columns change. How do we identify this :\n try {\n const filter = parseFilter(filterQuery);\n predicate = filterPredicate(columnMapOrFilter, filter);\n filterPredicateMap.set(filterQuery, predicate);\n return predicate;\n } catch (err) {\n console.warn(\n `filter-evaluation-utils, failed to parse filter \"${filterQuery}\"`,\n );\n return filterReject;\n }\n } else {\n throw Error(`[getFilterPredicate] invalid params`);\n }\n}\n\n/**\n * Generates a filterPredicate that can be used to test a row against a filter\n * Two row formats supported:\n * - DataRow, used by Tables, when evaluatingn a Menu filter.\n * - DataSourceRow, used by local data source, like ArrayDataSOurce\n */\n\n// prettier-ignore\nexport function filterPredicate(columnMap: ColumnMap,filter: Filter): FilterPredicate;\nexport function filterPredicate(filter: Filter): DataRowFilterPredicate;\nexport function filterPredicate(\n columnMapOrFilter: ColumnMap | Filter,\n filter?: Filter,\n): FilterPredicate | DataRowFilterPredicate {\n if (isFilter(columnMapOrFilter)) {\n switch (columnMapOrFilter.op) {\n case \"in\":\n return testDataRowInclude(columnMapOrFilter);\n case \"=\":\n return testDataRowEQ(columnMapOrFilter);\n case \">\":\n return testDataRowGT(columnMapOrFilter);\n case \">=\":\n return testDataRowGE(columnMapOrFilter);\n case \"<\":\n return testDataRowLT(columnMapOrFilter);\n case \"<=\":\n return testDataRowLE(columnMapOrFilter);\n case \"ends\":\n return testDataRowEW(columnMapOrFilter);\n case \"starts\":\n return testDataRowSW(columnMapOrFilter);\n case \"contains\":\n return testDataRowContains(columnMapOrFilter);\n case \"and\":\n return testDataRowAND(columnMapOrFilter as MultiClauseFilter<\"and\">);\n case \"or\":\n return testDataRowOR(columnMapOrFilter as MultiClauseFilter<\"or\">);\n default:\n console.log(`unrecognized filter type ${columnMapOrFilter.op}`);\n return () => true;\n }\n } else if (filter) {\n //TODO convert filter to include colIdx ratherthan colName, so we don't have to pass cols\n switch (filter.op) {\n case \"in\":\n return testInclude(columnMapOrFilter, filter);\n case \"=\":\n return testEQ(columnMapOrFilter, filter);\n case \">\":\n return testGT(columnMapOrFilter, filter);\n case \">=\":\n return testGE(columnMapOrFilter, filter);\n case \"<\":\n return testLT(columnMapOrFilter, filter);\n case \"<=\":\n return testLE(columnMapOrFilter, filter);\n case \"ends\":\n return testEW(columnMapOrFilter, filter);\n case \"starts\":\n return testSW(columnMapOrFilter, filter);\n case \"contains\":\n return testContains(columnMapOrFilter, filter);\n case \"and\":\n return testAND(columnMapOrFilter, filter as MultiClauseFilter<\"and\">);\n case \"or\":\n return testOR(columnMapOrFilter, filter as MultiClauseFilter<\"or\">);\n default:\n console.log(`unrecognized filter type ${filter.op}`);\n return () => true;\n }\n } else {\n throw Error(`[filterPredicate] invalid params`);\n }\n}\n\nconst testInclude = (\n columnMap: ColumnMap,\n filter: MultiValueFilterClause,\n): FilterPredicate => {\n return (row) =>\n (filter.values as unknown[]).indexOf(row[columnMap[filter.column]]) !== -1;\n};\n\nconst testDataRowInclude = (\n filter: MultiValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) =>\n (filter.values as unknown[]).indexOf(row[filter.column]) !== -1;\n};\n\nconst testEQ = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] === filter.value;\n};\n\nconst testDataRowEQ = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) => row[filter.column] === filter.value;\n};\n\nconst testGT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] > filter.value;\n};\n\nconst testDataRowGT = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) => row[filter.column] > filter.value;\n};\n\nconst testGE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] >= filter.value;\n};\n\nconst testDataRowGE = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) => row[filter.column] >= filter.value;\n};\n\nconst testLT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] < filter.value;\n};\n\nconst testDataRowLT = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) => row[filter.column] < filter.value;\n};\n\nconst testLE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] <= filter.value;\n};\n\nconst testDataRowLE = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) => row[filter.column] <= filter.value;\n};\n\nconst testEW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());\n };\n};\n\nconst testDataRowEW = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[filter.column];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());\n };\n};\n\nconst testSW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());\n };\n};\n\nconst testDataRowSW = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[filter.column];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());\n };\n};\n\nconst testContains = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().includes(filterValue.toLowerCase());\n };\n};\n\nconst testDataRowContains = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[filter.column];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().includes(filterValue.toLowerCase());\n };\n};\n\nconst testAND = (\n columnMap: ColumnMap,\n filter: MultiClauseFilter<\"and\">,\n): FilterPredicate => {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.every((fn) => fn(row));\n};\n\nconst testDataRowAND = (\n filter: MultiClauseFilter<\"and\">,\n): DataRowFilterPredicate => {\n const filters = filter.filters.map((f1) => filterPredicate(f1));\n return (row) => filters.every((fn) => fn(row));\n};\n\nfunction testOR(\n columnMap: ColumnMap,\n filter: MultiClauseFilter<\"or\">,\n): FilterPredicate {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.some((fn) => fn(row));\n}\n\nfunction testDataRowOR(\n filter: MultiClauseFilter<\"or\">,\n): DataRowFilterPredicate {\n const filters = filter.filters.map((f1) => filterPredicate(f1));\n return (row) => filters.some((fn) => fn(row));\n}\n"],"names":["parseFilter","isFilter"],"mappings":"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"}
|
|
@@ -1,71 +1,143 @@
|
|
|
1
|
+
import { isFilter } from '@vuu-ui/vuu-utils';
|
|
1
2
|
import { parseFilter } from './FilterParser.js';
|
|
2
3
|
|
|
3
4
|
const filterPredicateMap = /* @__PURE__ */ new Map();
|
|
5
|
+
const dataRowFilterPredicateMap = /* @__PURE__ */ new Map();
|
|
4
6
|
const filterReject = () => false;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
7
|
+
function getFilterPredicate(columnMapOrFilter, filterQuery) {
|
|
8
|
+
if (typeof columnMapOrFilter === "string") {
|
|
9
|
+
let predicate = dataRowFilterPredicateMap.get(columnMapOrFilter);
|
|
10
|
+
if (predicate) {
|
|
11
|
+
return predicate;
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
const filter = parseFilter(columnMapOrFilter);
|
|
15
|
+
predicate = filterPredicate(filter);
|
|
16
|
+
dataRowFilterPredicateMap.set(columnMapOrFilter, predicate);
|
|
17
|
+
return predicate;
|
|
18
|
+
} catch (err) {
|
|
19
|
+
console.warn(
|
|
20
|
+
`filter-evaluation-utils, failed to parse filter "${filterQuery}"`
|
|
21
|
+
);
|
|
22
|
+
return filterReject;
|
|
23
|
+
}
|
|
24
|
+
} else if (filterQuery) {
|
|
25
|
+
let predicate = filterPredicateMap.get(filterQuery);
|
|
26
|
+
if (predicate) {
|
|
27
|
+
return predicate;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const filter = parseFilter(filterQuery);
|
|
31
|
+
predicate = filterPredicate(columnMapOrFilter, filter);
|
|
32
|
+
filterPredicateMap.set(filterQuery, predicate);
|
|
33
|
+
return predicate;
|
|
34
|
+
} catch (err) {
|
|
35
|
+
console.warn(
|
|
36
|
+
`filter-evaluation-utils, failed to parse filter "${filterQuery}"`
|
|
37
|
+
);
|
|
38
|
+
return filterReject;
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
throw Error(`[getFilterPredicate] invalid params`);
|
|
20
42
|
}
|
|
21
|
-
}
|
|
22
|
-
function filterPredicate(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
}
|
|
44
|
+
function filterPredicate(columnMapOrFilter, filter) {
|
|
45
|
+
if (isFilter(columnMapOrFilter)) {
|
|
46
|
+
switch (columnMapOrFilter.op) {
|
|
47
|
+
case "in":
|
|
48
|
+
return testDataRowInclude(columnMapOrFilter);
|
|
49
|
+
case "=":
|
|
50
|
+
return testDataRowEQ(columnMapOrFilter);
|
|
51
|
+
case ">":
|
|
52
|
+
return testDataRowGT(columnMapOrFilter);
|
|
53
|
+
case ">=":
|
|
54
|
+
return testDataRowGE(columnMapOrFilter);
|
|
55
|
+
case "<":
|
|
56
|
+
return testDataRowLT(columnMapOrFilter);
|
|
57
|
+
case "<=":
|
|
58
|
+
return testDataRowLE(columnMapOrFilter);
|
|
59
|
+
case "ends":
|
|
60
|
+
return testDataRowEW(columnMapOrFilter);
|
|
61
|
+
case "starts":
|
|
62
|
+
return testDataRowSW(columnMapOrFilter);
|
|
63
|
+
case "contains":
|
|
64
|
+
return testDataRowContains(columnMapOrFilter);
|
|
65
|
+
case "and":
|
|
66
|
+
return testDataRowAND(columnMapOrFilter);
|
|
67
|
+
case "or":
|
|
68
|
+
return testDataRowOR(columnMapOrFilter);
|
|
69
|
+
default:
|
|
70
|
+
console.log(`unrecognized filter type ${columnMapOrFilter.op}`);
|
|
71
|
+
return () => true;
|
|
72
|
+
}
|
|
73
|
+
} else if (filter) {
|
|
74
|
+
switch (filter.op) {
|
|
75
|
+
case "in":
|
|
76
|
+
return testInclude(columnMapOrFilter, filter);
|
|
77
|
+
case "=":
|
|
78
|
+
return testEQ(columnMapOrFilter, filter);
|
|
79
|
+
case ">":
|
|
80
|
+
return testGT(columnMapOrFilter, filter);
|
|
81
|
+
case ">=":
|
|
82
|
+
return testGE(columnMapOrFilter, filter);
|
|
83
|
+
case "<":
|
|
84
|
+
return testLT(columnMapOrFilter, filter);
|
|
85
|
+
case "<=":
|
|
86
|
+
return testLE(columnMapOrFilter, filter);
|
|
87
|
+
case "ends":
|
|
88
|
+
return testEW(columnMapOrFilter, filter);
|
|
89
|
+
case "starts":
|
|
90
|
+
return testSW(columnMapOrFilter, filter);
|
|
91
|
+
case "contains":
|
|
92
|
+
return testContains(columnMapOrFilter, filter);
|
|
93
|
+
case "and":
|
|
94
|
+
return testAND(columnMapOrFilter, filter);
|
|
95
|
+
case "or":
|
|
96
|
+
return testOR(columnMapOrFilter, filter);
|
|
97
|
+
default:
|
|
98
|
+
console.log(`unrecognized filter type ${filter.op}`);
|
|
99
|
+
return () => true;
|
|
100
|
+
}
|
|
101
|
+
} else {
|
|
102
|
+
throw Error(`[filterPredicate] invalid params`);
|
|
49
103
|
}
|
|
50
104
|
}
|
|
51
105
|
const testInclude = (columnMap, filter) => {
|
|
52
106
|
return (row) => filter.values.indexOf(row[columnMap[filter.column]]) !== -1;
|
|
53
107
|
};
|
|
108
|
+
const testDataRowInclude = (filter) => {
|
|
109
|
+
return (row) => filter.values.indexOf(row[filter.column]) !== -1;
|
|
110
|
+
};
|
|
54
111
|
const testEQ = (columnMap, filter) => {
|
|
55
112
|
return (row) => row[columnMap[filter.column]] === filter.value;
|
|
56
113
|
};
|
|
114
|
+
const testDataRowEQ = (filter) => {
|
|
115
|
+
return (row) => row[filter.column] === filter.value;
|
|
116
|
+
};
|
|
57
117
|
const testGT = (columnMap, filter) => {
|
|
58
118
|
return (row) => row[columnMap[filter.column]] > filter.value;
|
|
59
119
|
};
|
|
120
|
+
const testDataRowGT = (filter) => {
|
|
121
|
+
return (row) => row[filter.column] > filter.value;
|
|
122
|
+
};
|
|
60
123
|
const testGE = (columnMap, filter) => {
|
|
61
124
|
return (row) => row[columnMap[filter.column]] >= filter.value;
|
|
62
125
|
};
|
|
126
|
+
const testDataRowGE = (filter) => {
|
|
127
|
+
return (row) => row[filter.column] >= filter.value;
|
|
128
|
+
};
|
|
63
129
|
const testLT = (columnMap, filter) => {
|
|
64
130
|
return (row) => row[columnMap[filter.column]] < filter.value;
|
|
65
131
|
};
|
|
132
|
+
const testDataRowLT = (filter) => {
|
|
133
|
+
return (row) => row[filter.column] < filter.value;
|
|
134
|
+
};
|
|
66
135
|
const testLE = (columnMap, filter) => {
|
|
67
136
|
return (row) => row[columnMap[filter.column]] <= filter.value;
|
|
68
137
|
};
|
|
138
|
+
const testDataRowLE = (filter) => {
|
|
139
|
+
return (row) => row[filter.column] <= filter.value;
|
|
140
|
+
};
|
|
69
141
|
const testEW = (columnMap, filter) => {
|
|
70
142
|
const filterValue = filter.value;
|
|
71
143
|
if (typeof filterValue !== "string") {
|
|
@@ -79,6 +151,19 @@ const testEW = (columnMap, filter) => {
|
|
|
79
151
|
return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());
|
|
80
152
|
};
|
|
81
153
|
};
|
|
154
|
+
const testDataRowEW = (filter) => {
|
|
155
|
+
const filterValue = filter.value;
|
|
156
|
+
if (typeof filterValue !== "string") {
|
|
157
|
+
throw Error("string filter applied to value of wrong type");
|
|
158
|
+
}
|
|
159
|
+
return (row) => {
|
|
160
|
+
const rowValue = row[filter.column];
|
|
161
|
+
if (typeof rowValue !== "string") {
|
|
162
|
+
throw Error("string filter applied to value of wrong type");
|
|
163
|
+
}
|
|
164
|
+
return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());
|
|
165
|
+
};
|
|
166
|
+
};
|
|
82
167
|
const testSW = (columnMap, filter) => {
|
|
83
168
|
const filterValue = filter.value;
|
|
84
169
|
if (typeof filterValue !== "string") {
|
|
@@ -92,6 +177,19 @@ const testSW = (columnMap, filter) => {
|
|
|
92
177
|
return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());
|
|
93
178
|
};
|
|
94
179
|
};
|
|
180
|
+
const testDataRowSW = (filter) => {
|
|
181
|
+
const filterValue = filter.value;
|
|
182
|
+
if (typeof filterValue !== "string") {
|
|
183
|
+
throw Error("string filter applied to value of wrong type");
|
|
184
|
+
}
|
|
185
|
+
return (row) => {
|
|
186
|
+
const rowValue = row[filter.column];
|
|
187
|
+
if (typeof rowValue !== "string") {
|
|
188
|
+
throw Error("string filter applied to value of wrong type");
|
|
189
|
+
}
|
|
190
|
+
return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());
|
|
191
|
+
};
|
|
192
|
+
};
|
|
95
193
|
const testContains = (columnMap, filter) => {
|
|
96
194
|
const filterValue = filter.value;
|
|
97
195
|
if (typeof filterValue !== "string") {
|
|
@@ -105,14 +203,35 @@ const testContains = (columnMap, filter) => {
|
|
|
105
203
|
return rowValue.toLowerCase().includes(filterValue.toLowerCase());
|
|
106
204
|
};
|
|
107
205
|
};
|
|
206
|
+
const testDataRowContains = (filter) => {
|
|
207
|
+
const filterValue = filter.value;
|
|
208
|
+
if (typeof filterValue !== "string") {
|
|
209
|
+
throw Error("string filter applied to value of wrong type");
|
|
210
|
+
}
|
|
211
|
+
return (row) => {
|
|
212
|
+
const rowValue = row[filter.column];
|
|
213
|
+
if (typeof rowValue !== "string") {
|
|
214
|
+
throw Error("string filter applied to value of wrong type");
|
|
215
|
+
}
|
|
216
|
+
return rowValue.toLowerCase().includes(filterValue.toLowerCase());
|
|
217
|
+
};
|
|
218
|
+
};
|
|
108
219
|
const testAND = (columnMap, filter) => {
|
|
109
220
|
const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));
|
|
110
221
|
return (row) => filters.every((fn) => fn(row));
|
|
111
222
|
};
|
|
223
|
+
const testDataRowAND = (filter) => {
|
|
224
|
+
const filters = filter.filters.map((f1) => filterPredicate(f1));
|
|
225
|
+
return (row) => filters.every((fn) => fn(row));
|
|
226
|
+
};
|
|
112
227
|
function testOR(columnMap, filter) {
|
|
113
228
|
const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));
|
|
114
229
|
return (row) => filters.some((fn) => fn(row));
|
|
115
230
|
}
|
|
231
|
+
function testDataRowOR(filter) {
|
|
232
|
+
const filters = filter.filters.map((f1) => filterPredicate(f1));
|
|
233
|
+
return (row) => filters.some((fn) => fn(row));
|
|
234
|
+
}
|
|
116
235
|
|
|
117
236
|
export { filterPredicate, getFilterPredicate };
|
|
118
237
|
//# sourceMappingURL=filter-evaluation-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-evaluation-utils.js","sources":["../../../packages/vuu-filter-parser/src/filter-evaluation-utils.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n Filter,\n MultiClauseFilter,\n MultiValueFilterClause,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport { parseFilter } from \"./FilterParser\";\nimport { VuuDataRow } from \"@vuu-ui/vuu-protocol-types\";\n\nconst filterPredicateMap = new Map<string, FilterPredicate>();\nconst filterReject = () => false;\n\nexport const getFilterPredicate = (\n columnMap: ColumnMap,\n filterQuery: string,\n): FilterPredicate => {\n let predicate = filterPredicateMap.get(filterQuery);\n if (predicate) {\n return predicate;\n }\n // TODO we need to clear cache if columns change. How do we identify this :\n try {\n const filter = parseFilter(filterQuery);\n predicate = filterPredicate(columnMap, filter);\n filterPredicateMap.set(filterQuery, predicate);\n return predicate;\n } catch (err) {\n console.warn(\n `filter-evaluation-utils, failed to parse filter \"${filterQuery}\"`,\n );\n return filterReject;\n }\n};\n\nexport function filterPredicate(\n columnMap: ColumnMap,\n filter: Filter,\n): FilterPredicate {\n //TODO convert filter to include colIdx ratherthan colName, so we don't have to pass cols\n switch (filter.op) {\n case \"in\":\n return testInclude(columnMap, filter);\n case \"=\":\n return testEQ(columnMap, filter);\n case \">\":\n return testGT(columnMap, filter);\n case \">=\":\n return testGE(columnMap, filter);\n case \"<\":\n return testLT(columnMap, filter);\n case \"<=\":\n return testLE(columnMap, filter);\n case \"ends\":\n return testEW(columnMap, filter);\n case \"starts\":\n return testSW(columnMap, filter);\n case \"contains\":\n return testContains(columnMap, filter);\n case \"and\":\n return testAND(columnMap, filter as MultiClauseFilter<\"and\">);\n case \"or\":\n return testOR(columnMap, filter as MultiClauseFilter<\"or\">);\n default:\n console.log(`unrecognized filter type ${filter.op}`);\n return () => true;\n }\n}\n\nexport type FilterPredicate = (row: DataSourceRow | VuuDataRow) => boolean;\n\nconst testInclude = (\n columnMap: ColumnMap,\n filter: MultiValueFilterClause,\n): FilterPredicate => {\n return (row) =>\n (filter.values as unknown[]).indexOf(row[columnMap[filter.column]]) !== -1;\n};\n\nconst testEQ = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] === filter.value;\n};\n\nconst testGT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] > filter.value;\n};\nconst testGE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] >= filter.value;\n};\n\nconst testLT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] < filter.value;\n};\nconst testLE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] <= filter.value;\n};\n\nconst testEW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());\n };\n};\n\nconst testSW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());\n };\n};\n\nconst testContains = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().includes(filterValue.toLowerCase());\n };\n};\n\nconst testAND = (\n columnMap: ColumnMap,\n filter: MultiClauseFilter<\"and\">,\n): FilterPredicate => {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.every((fn) => fn(row));\n};\n\nfunction testOR(\n columnMap: ColumnMap,\n filter: MultiClauseFilter<\"or\">,\n): FilterPredicate {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.some((fn) => fn(row));\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-evaluation-utils.js","sources":["../../../packages/vuu-filter-parser/src/filter-evaluation-utils.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n Filter,\n MultiClauseFilter,\n MultiValueFilterClause,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnMap, isFilter } from \"@vuu-ui/vuu-utils\";\nimport { parseFilter } from \"./FilterParser\";\nimport { VuuDataRow } from \"@vuu-ui/vuu-protocol-types\";\nimport { DataRow } from \"@vuu-ui/vuu-table-types\";\n\nconst filterPredicateMap = new Map<string, FilterPredicate>();\nconst dataRowFilterPredicateMap = new Map<string, DataRowFilterPredicate>();\nconst filterReject = () => false;\n\nexport type FilterPredicate = (row: DataSourceRow | VuuDataRow) => boolean;\nexport type DataRowFilterPredicate = (row: DataRow) => boolean;\n\nexport function getFilterPredicate(\n columnMap: ColumnMap,\n filterQuery: string,\n): FilterPredicate;\nexport function getFilterPredicate(filterQuery: string): DataRowFilterPredicate;\nexport function getFilterPredicate(\n columnMapOrFilter: ColumnMap | string,\n filterQuery?: string,\n): FilterPredicate | DataRowFilterPredicate {\n if (typeof columnMapOrFilter === \"string\") {\n let predicate = dataRowFilterPredicateMap.get(columnMapOrFilter);\n if (predicate) {\n return predicate;\n }\n // TODO we need to clear cache if columns change. How do we identify this :\n try {\n const filter = parseFilter(columnMapOrFilter);\n predicate = filterPredicate(filter);\n dataRowFilterPredicateMap.set(columnMapOrFilter, predicate);\n return predicate;\n } catch (err) {\n console.warn(\n `filter-evaluation-utils, failed to parse filter \"${filterQuery}\"`,\n );\n return filterReject;\n }\n } else if (filterQuery) {\n let predicate = filterPredicateMap.get(filterQuery);\n if (predicate) {\n return predicate;\n }\n // TODO we need to clear cache if columns change. How do we identify this :\n try {\n const filter = parseFilter(filterQuery);\n predicate = filterPredicate(columnMapOrFilter, filter);\n filterPredicateMap.set(filterQuery, predicate);\n return predicate;\n } catch (err) {\n console.warn(\n `filter-evaluation-utils, failed to parse filter \"${filterQuery}\"`,\n );\n return filterReject;\n }\n } else {\n throw Error(`[getFilterPredicate] invalid params`);\n }\n}\n\n/**\n * Generates a filterPredicate that can be used to test a row against a filter\n * Two row formats supported:\n * - DataRow, used by Tables, when evaluatingn a Menu filter.\n * - DataSourceRow, used by local data source, like ArrayDataSOurce\n */\n\n// prettier-ignore\nexport function filterPredicate(columnMap: ColumnMap,filter: Filter): FilterPredicate;\nexport function filterPredicate(filter: Filter): DataRowFilterPredicate;\nexport function filterPredicate(\n columnMapOrFilter: ColumnMap | Filter,\n filter?: Filter,\n): FilterPredicate | DataRowFilterPredicate {\n if (isFilter(columnMapOrFilter)) {\n switch (columnMapOrFilter.op) {\n case \"in\":\n return testDataRowInclude(columnMapOrFilter);\n case \"=\":\n return testDataRowEQ(columnMapOrFilter);\n case \">\":\n return testDataRowGT(columnMapOrFilter);\n case \">=\":\n return testDataRowGE(columnMapOrFilter);\n case \"<\":\n return testDataRowLT(columnMapOrFilter);\n case \"<=\":\n return testDataRowLE(columnMapOrFilter);\n case \"ends\":\n return testDataRowEW(columnMapOrFilter);\n case \"starts\":\n return testDataRowSW(columnMapOrFilter);\n case \"contains\":\n return testDataRowContains(columnMapOrFilter);\n case \"and\":\n return testDataRowAND(columnMapOrFilter as MultiClauseFilter<\"and\">);\n case \"or\":\n return testDataRowOR(columnMapOrFilter as MultiClauseFilter<\"or\">);\n default:\n console.log(`unrecognized filter type ${columnMapOrFilter.op}`);\n return () => true;\n }\n } else if (filter) {\n //TODO convert filter to include colIdx ratherthan colName, so we don't have to pass cols\n switch (filter.op) {\n case \"in\":\n return testInclude(columnMapOrFilter, filter);\n case \"=\":\n return testEQ(columnMapOrFilter, filter);\n case \">\":\n return testGT(columnMapOrFilter, filter);\n case \">=\":\n return testGE(columnMapOrFilter, filter);\n case \"<\":\n return testLT(columnMapOrFilter, filter);\n case \"<=\":\n return testLE(columnMapOrFilter, filter);\n case \"ends\":\n return testEW(columnMapOrFilter, filter);\n case \"starts\":\n return testSW(columnMapOrFilter, filter);\n case \"contains\":\n return testContains(columnMapOrFilter, filter);\n case \"and\":\n return testAND(columnMapOrFilter, filter as MultiClauseFilter<\"and\">);\n case \"or\":\n return testOR(columnMapOrFilter, filter as MultiClauseFilter<\"or\">);\n default:\n console.log(`unrecognized filter type ${filter.op}`);\n return () => true;\n }\n } else {\n throw Error(`[filterPredicate] invalid params`);\n }\n}\n\nconst testInclude = (\n columnMap: ColumnMap,\n filter: MultiValueFilterClause,\n): FilterPredicate => {\n return (row) =>\n (filter.values as unknown[]).indexOf(row[columnMap[filter.column]]) !== -1;\n};\n\nconst testDataRowInclude = (\n filter: MultiValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) =>\n (filter.values as unknown[]).indexOf(row[filter.column]) !== -1;\n};\n\nconst testEQ = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] === filter.value;\n};\n\nconst testDataRowEQ = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) => row[filter.column] === filter.value;\n};\n\nconst testGT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] > filter.value;\n};\n\nconst testDataRowGT = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) => row[filter.column] > filter.value;\n};\n\nconst testGE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] >= filter.value;\n};\n\nconst testDataRowGE = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) => row[filter.column] >= filter.value;\n};\n\nconst testLT = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] < filter.value;\n};\n\nconst testDataRowLT = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) => row[filter.column] < filter.value;\n};\n\nconst testLE = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n return (row) => row[columnMap[filter.column]] <= filter.value;\n};\n\nconst testDataRowLE = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n return (row) => row[filter.column] <= filter.value;\n};\n\nconst testEW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());\n };\n};\n\nconst testDataRowEW = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[filter.column];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());\n };\n};\n\nconst testSW = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());\n };\n};\n\nconst testDataRowSW = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[filter.column];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());\n };\n};\n\nconst testContains = (\n columnMap: ColumnMap,\n filter: SingleValueFilterClause,\n): FilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[columnMap[filter.column]];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().includes(filterValue.toLowerCase());\n };\n};\n\nconst testDataRowContains = (\n filter: SingleValueFilterClause,\n): DataRowFilterPredicate => {\n const filterValue = filter.value as string;\n if (typeof filterValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return (row) => {\n const rowValue = row[filter.column];\n if (typeof rowValue !== \"string\") {\n throw Error(\"string filter applied to value of wrong type\");\n }\n return rowValue.toLowerCase().includes(filterValue.toLowerCase());\n };\n};\n\nconst testAND = (\n columnMap: ColumnMap,\n filter: MultiClauseFilter<\"and\">,\n): FilterPredicate => {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.every((fn) => fn(row));\n};\n\nconst testDataRowAND = (\n filter: MultiClauseFilter<\"and\">,\n): DataRowFilterPredicate => {\n const filters = filter.filters.map((f1) => filterPredicate(f1));\n return (row) => filters.every((fn) => fn(row));\n};\n\nfunction testOR(\n columnMap: ColumnMap,\n filter: MultiClauseFilter<\"or\">,\n): FilterPredicate {\n const filters = filter.filters.map((f1) => filterPredicate(columnMap, f1));\n return (row) => filters.some((fn) => fn(row));\n}\n\nfunction testDataRowOR(\n filter: MultiClauseFilter<\"or\">,\n): DataRowFilterPredicate {\n const filters = filter.filters.map((f1) => filterPredicate(f1));\n return (row) => filters.some((fn) => fn(row));\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.13.
|
|
2
|
+
"version": "0.13.115-alpha.2",
|
|
3
3
|
"author": "heswell",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"devDependencies": {
|
|
7
|
+
"@vuu-ui/vuu-data-types": "0.13.115-alpha.2",
|
|
8
|
+
"@vuu-ui/vuu-filter-types": "0.13.115-alpha.2",
|
|
9
|
+
"@vuu-ui/vuu-table-types": "0.13.115-alpha.2"
|
|
10
|
+
},
|
|
6
11
|
"dependencies": {
|
|
7
12
|
"@lezer/common": "^1.0.2",
|
|
8
13
|
"@lezer/lr": "1.4.2",
|
|
9
|
-
"@vuu-ui/vuu-
|
|
10
|
-
"@vuu-ui/vuu-filter-types": "0.13.114",
|
|
11
|
-
"@vuu-ui/vuu-utils": "0.13.114"
|
|
14
|
+
"@vuu-ui/vuu-utils": "0.13.115-alpha.2"
|
|
12
15
|
},
|
|
13
16
|
"files": [
|
|
14
17
|
"README.md",
|
|
@@ -2,6 +2,16 @@ import { DataSourceRow } from "@vuu-ui/vuu-data-types";
|
|
|
2
2
|
import { Filter } from "@vuu-ui/vuu-filter-types";
|
|
3
3
|
import { ColumnMap } from "@vuu-ui/vuu-utils";
|
|
4
4
|
import { VuuDataRow } from "@vuu-ui/vuu-protocol-types";
|
|
5
|
-
|
|
6
|
-
export declare function filterPredicate(columnMap: ColumnMap, filter: Filter): FilterPredicate;
|
|
5
|
+
import { DataRow } from "@vuu-ui/vuu-table-types";
|
|
7
6
|
export type FilterPredicate = (row: DataSourceRow | VuuDataRow) => boolean;
|
|
7
|
+
export type DataRowFilterPredicate = (row: DataRow) => boolean;
|
|
8
|
+
export declare function getFilterPredicate(columnMap: ColumnMap, filterQuery: string): FilterPredicate;
|
|
9
|
+
export declare function getFilterPredicate(filterQuery: string): DataRowFilterPredicate;
|
|
10
|
+
/**
|
|
11
|
+
* Generates a filterPredicate that can be used to test a row against a filter
|
|
12
|
+
* Two row formats supported:
|
|
13
|
+
* - DataRow, used by Tables, when evaluatingn a Menu filter.
|
|
14
|
+
* - DataSourceRow, used by local data source, like ArrayDataSOurce
|
|
15
|
+
*/
|
|
16
|
+
export declare function filterPredicate(columnMap: ColumnMap, filter: Filter): FilterPredicate;
|
|
17
|
+
export declare function filterPredicate(filter: Filter): DataRowFilterPredicate;
|