@vuu-ui/vuu-filter-parser 3.5.17 → 3.5.18-beta.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.
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.5.17",
2
+ "version": "3.5.18-beta.1",
3
3
  "main": "./src/index.js",
4
4
  "author": "heswell",
5
5
  "license": "Apache-2.0",
@@ -12,14 +12,14 @@
12
12
  "type-defs": "node ../../scripts/build-type-defs.mjs"
13
13
  },
14
14
  "devDependencies": {
15
- "@vuu-ui/vuu-data-types": "3.5.17",
16
- "@vuu-ui/vuu-filter-types": "3.5.17",
17
- "@vuu-ui/vuu-table-types": "3.5.17"
15
+ "@vuu-ui/vuu-data-types": "3.5.18-beta.1",
16
+ "@vuu-ui/vuu-filter-types": "3.5.18-beta.1",
17
+ "@vuu-ui/vuu-table-types": "3.5.18-beta.1"
18
18
  },
19
19
  "dependencies": {
20
20
  "@lezer/common": "^1.0.2",
21
21
  "@lezer/lr": "1.4.2",
22
- "@vuu-ui/vuu-utils": "3.5.17"
22
+ "@vuu-ui/vuu-utils": "3.5.18-beta.1"
23
23
  },
24
24
  "files": [
25
25
  "README.md",
@@ -1,4 +1,4 @@
1
- import { isFilter, isScaledDecimalFilterClause } from "@vuu-ui/vuu-utils";
1
+ import { getScaledDecimalScale, isFilter, isScaledDecimalFilterClause, toDecimalString, toScaledInteger } from "@vuu-ui/vuu-utils";
2
2
  import { parseFilter } from "./FilterParser.js";
3
3
  const filterPredicateMap = new Map();
4
4
  const dataRowFilterPredicateMap = new Map();
@@ -32,7 +32,7 @@ function getFilterPredicate(columnMapOrFilter, filterQuery) {
32
32
  }
33
33
  throw Error("[getFilterPredicate] invalid params");
34
34
  }
35
- function filterPredicate(columnMapOrFilter, filter) {
35
+ function filterPredicate(columnMapOrFilter, filter, columnsByName) {
36
36
  if (isFilter(columnMapOrFilter)) switch(columnMapOrFilter.op){
37
37
  case "in":
38
38
  return testDataRowInclude(columnMapOrFilter);
@@ -65,40 +65,72 @@ function filterPredicate(columnMapOrFilter, filter) {
65
65
  return ()=>true;
66
66
  }
67
67
  }
68
- if (filter) switch(filter.op){
69
- case "in":
70
- return testInclude(columnMapOrFilter, filter);
71
- case "=":
72
- return testEQ(columnMapOrFilter, filter);
73
- case "!=":
74
- return testNE(columnMapOrFilter, filter);
75
- case ">":
76
- return testGT(columnMapOrFilter, filter);
77
- case ">=":
78
- return testGE(columnMapOrFilter, filter);
79
- case "<":
80
- return testLT(columnMapOrFilter, filter);
81
- case "<=":
82
- return testLE(columnMapOrFilter, filter);
83
- case "ends":
84
- return testEW(columnMapOrFilter, filter);
85
- case "starts":
86
- return testSW(columnMapOrFilter, filter);
87
- case "contains":
88
- return testContains(columnMapOrFilter, filter);
89
- case "and":
90
- return testAND(columnMapOrFilter, filter);
91
- case "or":
92
- return testOR(columnMapOrFilter, filter);
93
- default:
94
- {
95
- const unreachable = filter;
96
- console.log('unrecognized filter type', unreachable);
97
- return ()=>true;
98
- }
68
+ if (filter) {
69
+ const scale = void 0 === filter.column ? void 0 : getScaledDecimalScale(columnsByName?.[filter.column]?.serverDataType);
70
+ if (void 0 !== scale && isComparisonOp(filter.op)) return testScaledDecimal(columnMapOrFilter, filter, scale);
71
+ switch(filter.op){
72
+ case "in":
73
+ return testInclude(columnMapOrFilter, filter);
74
+ case "=":
75
+ return testEQ(columnMapOrFilter, filter);
76
+ case "!=":
77
+ return testNE(columnMapOrFilter, filter);
78
+ case ">":
79
+ return testGT(columnMapOrFilter, filter);
80
+ case ">=":
81
+ return testGE(columnMapOrFilter, filter);
82
+ case "<":
83
+ return testLT(columnMapOrFilter, filter);
84
+ case "<=":
85
+ return testLE(columnMapOrFilter, filter);
86
+ case "ends":
87
+ return testEW(columnMapOrFilter, filter);
88
+ case "starts":
89
+ return testSW(columnMapOrFilter, filter);
90
+ case "contains":
91
+ return testContains(columnMapOrFilter, filter);
92
+ case "and":
93
+ return testAND(columnMapOrFilter, filter, columnsByName);
94
+ case "or":
95
+ return testOR(columnMapOrFilter, filter, columnsByName);
96
+ default:
97
+ {
98
+ const unreachable = filter;
99
+ console.log('unrecognized filter type', unreachable);
100
+ return ()=>true;
101
+ }
102
+ }
99
103
  }
100
104
  throw Error("[filterPredicate] invalid params");
101
105
  }
106
+ const comparisonOps = [
107
+ "=",
108
+ "!=",
109
+ ">",
110
+ ">=",
111
+ "<",
112
+ "<="
113
+ ];
114
+ const isComparisonOp = (op)=>comparisonOps.includes(op);
115
+ const compare = {
116
+ "=": (a, b)=>a === b,
117
+ "!=": (a, b)=>a !== b,
118
+ ">": (a, b)=>a > b,
119
+ ">=": (a, b)=>a >= b,
120
+ "<": (a, b)=>a < b,
121
+ "<=": (a, b)=>a <= b
122
+ };
123
+ const testScaledDecimal = (columnMap, filter, scale)=>{
124
+ const op = filter.op;
125
+ const test = compare[op];
126
+ const filterValue = toScaledInteger(toDecimalString(filter.value, scale), scale);
127
+ const index = columnMap[filter.column];
128
+ return (row)=>{
129
+ const value = row[index];
130
+ if ("" === value || null == value) return "!=" === op;
131
+ return test(BigInt(value), filterValue);
132
+ };
133
+ };
102
134
  const testInclude = (columnMap, filter)=>(row)=>-1 !== filter.values.indexOf(row[columnMap[filter.column]]);
103
135
  const testDataRowInclude = (filter)=>(row)=>-1 !== filter.values.indexOf(row[filter.column]);
104
136
  const testEQ = (columnMap, filter)=>{
@@ -173,16 +205,16 @@ const testDataRowContains = (filter)=>{
173
205
  return rowValue.toLowerCase().includes(filterValue.toLowerCase());
174
206
  };
175
207
  };
176
- const testAND = (columnMap, filter)=>{
177
- const filters = filter.filters.map((f1)=>filterPredicate(columnMap, f1));
208
+ const testAND = (columnMap, filter, columnsByName)=>{
209
+ const filters = filter.filters.map((f1)=>filterPredicate(columnMap, f1, columnsByName));
178
210
  return (row)=>filters.every((fn)=>fn(row));
179
211
  };
180
212
  const testDataRowAND = (filter)=>{
181
213
  const filters = filter.filters.map((f1)=>filterPredicate(f1));
182
214
  return (row)=>filters.every((fn)=>fn(row));
183
215
  };
184
- function testOR(columnMap, filter) {
185
- const filters = filter.filters.map((f1)=>filterPredicate(columnMap, f1));
216
+ function testOR(columnMap, filter, columnsByName) {
217
+ const filters = filter.filters.map((f1)=>filterPredicate(columnMap, f1, columnsByName));
186
218
  return (row)=>filters.some((fn)=>fn(row));
187
219
  }
188
220
  function testDataRowOR(filter) {
@@ -1,5 +1,5 @@
1
1
  import { DataSourceRowWithBigint } from "@vuu-ui/vuu-data-types";
2
- import { Filter } from "@vuu-ui/vuu-filter-types";
2
+ import { ColumnDescriptorsByName, 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
5
  import { DataRow } from "@vuu-ui/vuu-table-types";
@@ -12,6 +12,8 @@ export declare function getFilterPredicate(filterQuery: string): DataRowFilterPr
12
12
  * Two row formats supported:
13
13
  * - DataRow, used by Tables, when evaluatingn a Menu filter.
14
14
  * - DataSourceRow, used by local data source, like ArrayDataSOurce
15
+ * For a DataSourceRow, columnsByName provides the column types, required to
16
+ * compare scaled decimal values, which are held as scaled integer strings.
15
17
  */
16
- export declare function filterPredicate(columnMap: ColumnMap, filter: Filter): FilterPredicate;
18
+ export declare function filterPredicate(columnMap: ColumnMap, filter: Filter, columnsByName?: ColumnDescriptorsByName): FilterPredicate;
17
19
  export declare function filterPredicate(filter: Filter): DataRowFilterPredicate;