@vuu-ui/vuu-filter-parser 0.13.113 → 0.13.115-alpha.1

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
- const getFilterPredicate = (columnMap, filterQuery) => {
8
- let predicate = filterPredicateMap.get(filterQuery);
9
- if (predicate) {
10
- return predicate;
11
- }
12
- try {
13
- const filter = FilterParser.parseFilter(filterQuery);
14
- predicate = filterPredicate(columnMap, filter);
15
- filterPredicateMap.set(filterQuery, predicate);
16
- return predicate;
17
- } catch (err) {
18
- console.warn(
19
- `filter-evaluation-utils, failed to parse filter "${filterQuery}"`
20
- );
21
- return filterReject;
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(columnMap, filter) {
25
- switch (filter.op) {
26
- case "in":
27
- return testInclude(columnMap, filter);
28
- case "=":
29
- return testEQ(columnMap, filter);
30
- case ">":
31
- return testGT(columnMap, filter);
32
- case ">=":
33
- return testGE(columnMap, filter);
34
- case "<":
35
- return testLT(columnMap, filter);
36
- case "<=":
37
- return testLE(columnMap, filter);
38
- case "ends":
39
- return testEW(columnMap, filter);
40
- case "starts":
41
- return testSW(columnMap, filter);
42
- case "contains":
43
- return testContains(columnMap, filter);
44
- case "and":
45
- return testAND(columnMap, filter);
46
- case "or":
47
- return testOR(columnMap, filter);
48
- default:
49
- console.log(`unrecognized filter type ${filter.op}`);
50
- return () => true;
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
- const getFilterPredicate = (columnMap, filterQuery) => {
6
- let predicate = filterPredicateMap.get(filterQuery);
7
- if (predicate) {
8
- return predicate;
9
- }
10
- try {
11
- const filter = parseFilter(filterQuery);
12
- predicate = filterPredicate(columnMap, filter);
13
- filterPredicateMap.set(filterQuery, predicate);
14
- return predicate;
15
- } catch (err) {
16
- console.warn(
17
- `filter-evaluation-utils, failed to parse filter "${filterQuery}"`
18
- );
19
- return filterReject;
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(columnMap, filter) {
23
- switch (filter.op) {
24
- case "in":
25
- return testInclude(columnMap, filter);
26
- case "=":
27
- return testEQ(columnMap, filter);
28
- case ">":
29
- return testGT(columnMap, filter);
30
- case ">=":
31
- return testGE(columnMap, filter);
32
- case "<":
33
- return testLT(columnMap, filter);
34
- case "<=":
35
- return testLE(columnMap, filter);
36
- case "ends":
37
- return testEW(columnMap, filter);
38
- case "starts":
39
- return testSW(columnMap, filter);
40
- case "contains":
41
- return testContains(columnMap, filter);
42
- case "and":
43
- return testAND(columnMap, filter);
44
- case "or":
45
- return testOR(columnMap, filter);
46
- default:
47
- console.log(`unrecognized filter type ${filter.op}`);
48
- return () => true;
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.113",
2
+ "version": "0.13.115-alpha.1",
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.1",
8
+ "@vuu-ui/vuu-filter-types": "0.13.115-alpha.1",
9
+ "@vuu-ui/vuu-table-types": "0.13.115-alpha.1"
10
+ },
6
11
  "dependencies": {
7
12
  "@lezer/common": "^1.0.2",
8
13
  "@lezer/lr": "1.4.2",
9
- "@vuu-ui/vuu-data-types": "0.13.113",
10
- "@vuu-ui/vuu-filter-types": "0.13.113",
11
- "@vuu-ui/vuu-utils": "0.13.113"
14
+ "@vuu-ui/vuu-utils": "0.13.115-alpha.1"
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
- export declare const getFilterPredicate: (columnMap: ColumnMap, filterQuery: string) => FilterPredicate;
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;