@vuu-ui/vuu-filter-parser 5.0.0-alpha.3 → 5.0.0-alpha.5
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 +5 -5
- package/src/filter-evaluation-utils.js +46 -35
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "5.0.0-alpha.
|
|
2
|
+
"version": "5.0.0-alpha.5",
|
|
3
3
|
"main": "./src/index.js",
|
|
4
4
|
"author": "heswell",
|
|
5
5
|
"license": "Apache-2.0",
|
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
"tsc:trace": "tsc --traceResolution -p ./tsconfig-emit-types.json"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@vuu-ui/vuu-data-types": "5.0.0-alpha.
|
|
18
|
-
"@vuu-ui/vuu-filter-types": "5.0.0-alpha.
|
|
19
|
-
"@vuu-ui/vuu-table-types": "5.0.0-alpha.
|
|
17
|
+
"@vuu-ui/vuu-data-types": "5.0.0-alpha.5",
|
|
18
|
+
"@vuu-ui/vuu-filter-types": "5.0.0-alpha.5",
|
|
19
|
+
"@vuu-ui/vuu-table-types": "5.0.0-alpha.5"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@lezer/common": "^1.0.2",
|
|
23
23
|
"@lezer/lr": "1.4.2",
|
|
24
|
-
"@vuu-ui/vuu-utils": "5.0.0-alpha.
|
|
24
|
+
"@vuu-ui/vuu-utils": "5.0.0-alpha.5"
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
27
27
|
"README.md",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getScaledDecimalScale, isFilter, isScaledDecimalFilterClause, toDecimalString, toScaledInteger } from "@vuu-ui/vuu-utils";
|
|
1
|
+
import { getScaledDecimalScale, isFilter, isScaledDecimalFilterClause, stringIsValidLong, 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();
|
|
@@ -37,17 +37,12 @@ function filterPredicate(columnMapOrFilter, filter, columnsByName) {
|
|
|
37
37
|
case "in":
|
|
38
38
|
return testDataRowInclude(columnMapOrFilter);
|
|
39
39
|
case "=":
|
|
40
|
-
return testDataRowEQ(columnMapOrFilter);
|
|
41
40
|
case "!=":
|
|
42
|
-
return testDataRowNE(columnMapOrFilter);
|
|
43
41
|
case ">":
|
|
44
|
-
return testDataRowGT(columnMapOrFilter);
|
|
45
42
|
case ">=":
|
|
46
|
-
return testDataRowGE(columnMapOrFilter);
|
|
47
43
|
case "<":
|
|
48
|
-
return testDataRowLT(columnMapOrFilter);
|
|
49
44
|
case "<=":
|
|
50
|
-
return
|
|
45
|
+
return testDataRowComparison(columnMapOrFilter);
|
|
51
46
|
case "ends":
|
|
52
47
|
return testDataRowEW(columnMapOrFilter);
|
|
53
48
|
case "starts":
|
|
@@ -61,7 +56,7 @@ function filterPredicate(columnMapOrFilter, filter, columnsByName) {
|
|
|
61
56
|
default:
|
|
62
57
|
{
|
|
63
58
|
const unreachable = columnMapOrFilter;
|
|
64
|
-
console.log(
|
|
59
|
+
console.log("unrecognized filter type", unreachable);
|
|
65
60
|
return ()=>true;
|
|
66
61
|
}
|
|
67
62
|
}
|
|
@@ -72,17 +67,12 @@ function filterPredicate(columnMapOrFilter, filter, columnsByName) {
|
|
|
72
67
|
case "in":
|
|
73
68
|
return testInclude(columnMapOrFilter, filter);
|
|
74
69
|
case "=":
|
|
75
|
-
return testEQ(columnMapOrFilter, filter);
|
|
76
70
|
case "!=":
|
|
77
|
-
return testNE(columnMapOrFilter, filter);
|
|
78
71
|
case ">":
|
|
79
|
-
return testGT(columnMapOrFilter, filter);
|
|
80
72
|
case ">=":
|
|
81
|
-
return testGE(columnMapOrFilter, filter);
|
|
82
73
|
case "<":
|
|
83
|
-
return testLT(columnMapOrFilter, filter);
|
|
84
74
|
case "<=":
|
|
85
|
-
return
|
|
75
|
+
return testComparison(columnMapOrFilter, filter);
|
|
86
76
|
case "ends":
|
|
87
77
|
return testEW(columnMapOrFilter, filter);
|
|
88
78
|
case "starts":
|
|
@@ -96,7 +86,7 @@ function filterPredicate(columnMapOrFilter, filter, columnsByName) {
|
|
|
96
86
|
default:
|
|
97
87
|
{
|
|
98
88
|
const unreachable = filter;
|
|
99
|
-
console.log(
|
|
89
|
+
console.log("unrecognized filter type", unreachable);
|
|
100
90
|
return ()=>true;
|
|
101
91
|
}
|
|
102
92
|
}
|
|
@@ -131,26 +121,47 @@ const testScaledDecimal = (columnMap, filter, scale)=>{
|
|
|
131
121
|
return test(BigInt(value), filterValue);
|
|
132
122
|
};
|
|
133
123
|
};
|
|
134
|
-
const
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const
|
|
145
|
-
const
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
124
|
+
const asNumber = (value)=>"string" == typeof value && stringIsValidLong(value) ? Number(value) : void 0;
|
|
125
|
+
const comparisons = {
|
|
126
|
+
"=": (a, b)=>a === b,
|
|
127
|
+
"!=": (a, b)=>a !== b,
|
|
128
|
+
">": (a, b)=>a > b,
|
|
129
|
+
">=": (a, b)=>a >= b,
|
|
130
|
+
"<": (a, b)=>a < b,
|
|
131
|
+
"<=": (a, b)=>a <= b
|
|
132
|
+
};
|
|
133
|
+
const valueComparison = (filter)=>{
|
|
134
|
+
const test = comparisons[filter.op];
|
|
135
|
+
const { value } = filter;
|
|
136
|
+
const numericValue = asNumber(value);
|
|
137
|
+
return void 0 === numericValue ? (rowValue)=>test(rowValue, value) : (rowValue)=>test(rowValue, "number" == typeof rowValue ? numericValue : value);
|
|
138
|
+
};
|
|
139
|
+
const includesValue = (filter)=>{
|
|
140
|
+
const values = filter.values;
|
|
141
|
+
const numericValues = values.map((value)=>asNumber(value) ?? value);
|
|
142
|
+
return (rowValue)=>("number" == typeof rowValue ? numericValues : values).includes(rowValue);
|
|
143
|
+
};
|
|
144
|
+
const testInclude = (columnMap, filter)=>{
|
|
145
|
+
const includes = includesValue(filter);
|
|
146
|
+
return (row)=>includes(row[columnMap[filter.column]]);
|
|
147
|
+
};
|
|
148
|
+
const testDataRowInclude = (filter)=>{
|
|
149
|
+
const includes = includesValue(filter);
|
|
150
|
+
return (row)=>includes(row[filter.column]);
|
|
151
|
+
};
|
|
152
|
+
const testComparison = (columnMap, filter)=>{
|
|
153
|
+
const index = columnMap[filter.column];
|
|
154
|
+
if (isScaledDecimalFilterClause(filter) && ("=" === filter.op || "!=" === filter.op)) {
|
|
155
|
+
const { asLong } = filter.value;
|
|
156
|
+
return "=" === filter.op ? (row)=>row[index] === asLong : (row)=>row[index] !== asLong;
|
|
157
|
+
}
|
|
158
|
+
const test = valueComparison(filter);
|
|
159
|
+
return (row)=>test(row[index]);
|
|
160
|
+
};
|
|
161
|
+
const testDataRowComparison = (filter)=>{
|
|
162
|
+
const test = valueComparison(filter);
|
|
163
|
+
return (row)=>test(row[filter.column]);
|
|
164
|
+
};
|
|
154
165
|
const testEW = (columnMap, filter)=>{
|
|
155
166
|
const filterValue = filter.value;
|
|
156
167
|
if ("string" != typeof filterValue) throw Error("string filter applied to value of wrong type");
|