@vuu-ui/vuu-filter-parser 2.1.18 → 2.1.19-beta.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.
- package/package.json +8 -11
- package/src/FilterParser.js +11 -0
- package/src/FilterTreeWalker.js +92 -0
- package/src/filter-evaluation-utils.js +177 -0
- package/src/index.js +4 -0
- package/types/generated/filter-parser.d.ts +1 -1
- package/types/generated/filter-parser.terms.d.ts +1 -28
- package/cjs/FilterParser.js +0 -14
- package/cjs/FilterParser.js.map +0 -1
- package/cjs/FilterTreeWalker.js +0 -128
- package/cjs/FilterTreeWalker.js.map +0 -1
- package/cjs/filter-evaluation-utils.js +0 -244
- package/cjs/filter-evaluation-utils.js.map +0 -1
- package/cjs/generated/filter-parser.js +0 -21
- package/cjs/generated/filter-parser.js.map +0 -1
- package/cjs/index.js +0 -15
- package/cjs/index.js.map +0 -1
- package/esm/FilterParser.js +0 -12
- package/esm/FilterParser.js.map +0 -1
- package/esm/FilterTreeWalker.js +0 -126
- package/esm/FilterTreeWalker.js.map +0 -1
- package/esm/filter-evaluation-utils.js +0 -241
- package/esm/filter-evaluation-utils.js.map +0 -1
- package/esm/generated/filter-parser.js +0 -19
- package/esm/generated/filter-parser.js.map +0 -1
- package/esm/index.js +0 -5
- package/esm/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,33 +1,30 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.1.
|
|
2
|
+
"version": "2.1.19-beta.2",
|
|
3
3
|
"author": "heswell",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"devDependencies": {
|
|
7
|
-
"@vuu-ui/vuu-data-types": "2.1.
|
|
8
|
-
"@vuu-ui/vuu-filter-types": "2.1.
|
|
9
|
-
"@vuu-ui/vuu-table-types": "2.1.
|
|
7
|
+
"@vuu-ui/vuu-data-types": "2.1.19-beta.2",
|
|
8
|
+
"@vuu-ui/vuu-filter-types": "2.1.19-beta.2",
|
|
9
|
+
"@vuu-ui/vuu-table-types": "2.1.19-beta.2"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@lezer/common": "^1.0.2",
|
|
13
13
|
"@lezer/lr": "1.4.2",
|
|
14
|
-
"@vuu-ui/vuu-utils": "2.1.
|
|
14
|
+
"@vuu-ui/vuu-utils": "2.1.19-beta.2"
|
|
15
15
|
},
|
|
16
16
|
"files": [
|
|
17
17
|
"README.md",
|
|
18
|
-
"
|
|
19
|
-
"cjs",
|
|
18
|
+
"src",
|
|
20
19
|
"/types"
|
|
21
20
|
],
|
|
22
21
|
"exports": {
|
|
23
22
|
".": {
|
|
24
|
-
"
|
|
25
|
-
"import": "./esm/index.js",
|
|
23
|
+
"import": "./src/index.js",
|
|
26
24
|
"types": "./types/index.d.ts"
|
|
27
25
|
}
|
|
28
26
|
},
|
|
29
|
-
"
|
|
30
|
-
"module": "esm/index.js",
|
|
27
|
+
"module": "index.js",
|
|
31
28
|
"name": "@vuu-ui/vuu-filter-parser",
|
|
32
29
|
"types": "types/index.d.ts"
|
|
33
30
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { parser } from "./generated/filter-parser.js";
|
|
2
|
+
import { walkTree } from "./FilterTreeWalker.js";
|
|
3
|
+
const strictParser = parser.configure({
|
|
4
|
+
strict: true
|
|
5
|
+
});
|
|
6
|
+
const parseFilter = (filterQuery)=>{
|
|
7
|
+
const parseTree = strictParser.parse(filterQuery);
|
|
8
|
+
const filter = walkTree(parseTree, filterQuery);
|
|
9
|
+
return filter;
|
|
10
|
+
};
|
|
11
|
+
export { parseFilter };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { isMultiClauseFilter, isMultiValueFilter, isSingleValueFilter } from "@vuu-ui/vuu-utils";
|
|
2
|
+
class FilterExpression {
|
|
3
|
+
name;
|
|
4
|
+
#filter = void 0;
|
|
5
|
+
setFilterCombinatorOp(op, filter = this.#filter) {
|
|
6
|
+
if (isMultiClauseFilter(filter) && filter.op === op) return;
|
|
7
|
+
this.#filter = {
|
|
8
|
+
op: op,
|
|
9
|
+
filters: [
|
|
10
|
+
this.#filter
|
|
11
|
+
]
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
add(filter) {
|
|
15
|
+
if (void 0 === this.#filter) this.#filter = filter;
|
|
16
|
+
else if (isMultiClauseFilter(this.#filter)) this.#filter.filters.push(filter);
|
|
17
|
+
else throw Error("Invalid filter passed to FilterExpression");
|
|
18
|
+
}
|
|
19
|
+
setColumn(column, filter = this.#filter) {
|
|
20
|
+
if (isMultiClauseFilter(filter)) {
|
|
21
|
+
const target = filter.filters.at(-1);
|
|
22
|
+
if (target) this.setColumn(column, target);
|
|
23
|
+
} else if (filter) filter.column = column;
|
|
24
|
+
}
|
|
25
|
+
setOp(value, filter = this.#filter) {
|
|
26
|
+
if (isMultiClauseFilter(filter)) {
|
|
27
|
+
const target = filter.filters.at(-1);
|
|
28
|
+
if (target) this.setOp(value, target);
|
|
29
|
+
} else if (filter) filter.op = value;
|
|
30
|
+
}
|
|
31
|
+
setValue(value, filter = this.#filter) {
|
|
32
|
+
if (isMultiClauseFilter(filter)) {
|
|
33
|
+
const target = filter.filters.at(-1);
|
|
34
|
+
if (target) this.setValue(value, target);
|
|
35
|
+
} else if (isMultiValueFilter(filter)) {
|
|
36
|
+
filter.values ??= [];
|
|
37
|
+
filter.values.push(value);
|
|
38
|
+
} else if (isSingleValueFilter(filter)) filter.value = value;
|
|
39
|
+
}
|
|
40
|
+
toJSON(filter = this.#filter) {
|
|
41
|
+
if (this.name) return {
|
|
42
|
+
...filter,
|
|
43
|
+
name: this.name
|
|
44
|
+
};
|
|
45
|
+
return filter;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const walkTree = (tree, source)=>{
|
|
49
|
+
const filterExpression = new FilterExpression();
|
|
50
|
+
const cursor = tree.cursor();
|
|
51
|
+
do {
|
|
52
|
+
const { name, from, to } = cursor;
|
|
53
|
+
switch(name){
|
|
54
|
+
case "ColumnValueExpression":
|
|
55
|
+
filterExpression.add({});
|
|
56
|
+
break;
|
|
57
|
+
case "ColumnSetExpression":
|
|
58
|
+
filterExpression.add({
|
|
59
|
+
op: "in"
|
|
60
|
+
});
|
|
61
|
+
break;
|
|
62
|
+
case "Or":
|
|
63
|
+
case "And":
|
|
64
|
+
filterExpression.setFilterCombinatorOp(source.substring(from, to));
|
|
65
|
+
break;
|
|
66
|
+
case "Column":
|
|
67
|
+
filterExpression.setColumn(source.substring(from, to));
|
|
68
|
+
break;
|
|
69
|
+
case "Operator":
|
|
70
|
+
filterExpression.setOp(source.substring(from, to));
|
|
71
|
+
break;
|
|
72
|
+
case "String":
|
|
73
|
+
filterExpression.setValue(source.substring(from + 1, to - 1));
|
|
74
|
+
break;
|
|
75
|
+
case "Number":
|
|
76
|
+
filterExpression.setValue(parseFloat(source.substring(from, to)));
|
|
77
|
+
break;
|
|
78
|
+
case "True":
|
|
79
|
+
filterExpression.setValue(true);
|
|
80
|
+
break;
|
|
81
|
+
case "False":
|
|
82
|
+
filterExpression.setValue(false);
|
|
83
|
+
break;
|
|
84
|
+
case "FilterName":
|
|
85
|
+
filterExpression.name = source.substring(from, to);
|
|
86
|
+
break;
|
|
87
|
+
default:
|
|
88
|
+
}
|
|
89
|
+
}while (cursor.next())
|
|
90
|
+
return filterExpression.toJSON();
|
|
91
|
+
};
|
|
92
|
+
export { walkTree };
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { isFilter, isScaledDecimalFilterClause } from "@vuu-ui/vuu-utils";
|
|
2
|
+
import { parseFilter } from "./FilterParser.js";
|
|
3
|
+
const filterPredicateMap = new Map();
|
|
4
|
+
const dataRowFilterPredicateMap = new Map();
|
|
5
|
+
const filterReject = ()=>false;
|
|
6
|
+
function getFilterPredicate(columnMapOrFilter, filterQuery) {
|
|
7
|
+
if ("string" == typeof columnMapOrFilter) {
|
|
8
|
+
let predicate = dataRowFilterPredicateMap.get(columnMapOrFilter);
|
|
9
|
+
if (predicate) return predicate;
|
|
10
|
+
try {
|
|
11
|
+
const filter = parseFilter(columnMapOrFilter);
|
|
12
|
+
predicate = filterPredicate(filter);
|
|
13
|
+
dataRowFilterPredicateMap.set(columnMapOrFilter, predicate);
|
|
14
|
+
return predicate;
|
|
15
|
+
} catch (err) {
|
|
16
|
+
console.warn(`filter-evaluation-utils, failed to parse filter "${filterQuery}"`);
|
|
17
|
+
return filterReject;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (filterQuery) {
|
|
21
|
+
let predicate = filterPredicateMap.get(filterQuery);
|
|
22
|
+
if (predicate) return predicate;
|
|
23
|
+
try {
|
|
24
|
+
const filter = parseFilter(filterQuery);
|
|
25
|
+
predicate = filterPredicate(columnMapOrFilter, filter);
|
|
26
|
+
filterPredicateMap.set(filterQuery, predicate);
|
|
27
|
+
return predicate;
|
|
28
|
+
} catch (err) {
|
|
29
|
+
console.warn(`filter-evaluation-utils, failed to parse filter "${filterQuery}"`);
|
|
30
|
+
return filterReject;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throw Error("[getFilterPredicate] invalid params");
|
|
34
|
+
}
|
|
35
|
+
function filterPredicate(columnMapOrFilter, filter) {
|
|
36
|
+
if (isFilter(columnMapOrFilter)) switch(columnMapOrFilter.op){
|
|
37
|
+
case "in":
|
|
38
|
+
return testDataRowInclude(columnMapOrFilter);
|
|
39
|
+
case "=":
|
|
40
|
+
return testDataRowEQ(columnMapOrFilter);
|
|
41
|
+
case ">":
|
|
42
|
+
return testDataRowGT(columnMapOrFilter);
|
|
43
|
+
case ">=":
|
|
44
|
+
return testDataRowGE(columnMapOrFilter);
|
|
45
|
+
case "<":
|
|
46
|
+
return testDataRowLT(columnMapOrFilter);
|
|
47
|
+
case "<=":
|
|
48
|
+
return testDataRowLE(columnMapOrFilter);
|
|
49
|
+
case "ends":
|
|
50
|
+
return testDataRowEW(columnMapOrFilter);
|
|
51
|
+
case "starts":
|
|
52
|
+
return testDataRowSW(columnMapOrFilter);
|
|
53
|
+
case "contains":
|
|
54
|
+
return testDataRowContains(columnMapOrFilter);
|
|
55
|
+
case "and":
|
|
56
|
+
return testDataRowAND(columnMapOrFilter);
|
|
57
|
+
case "or":
|
|
58
|
+
return testDataRowOR(columnMapOrFilter);
|
|
59
|
+
default:
|
|
60
|
+
console.log(`unrecognized filter type ${columnMapOrFilter.op}`);
|
|
61
|
+
return ()=>true;
|
|
62
|
+
}
|
|
63
|
+
if (filter) switch(filter.op){
|
|
64
|
+
case "in":
|
|
65
|
+
return testInclude(columnMapOrFilter, filter);
|
|
66
|
+
case "=":
|
|
67
|
+
return testEQ(columnMapOrFilter, filter);
|
|
68
|
+
case ">":
|
|
69
|
+
return testGT(columnMapOrFilter, filter);
|
|
70
|
+
case ">=":
|
|
71
|
+
return testGE(columnMapOrFilter, filter);
|
|
72
|
+
case "<":
|
|
73
|
+
return testLT(columnMapOrFilter, filter);
|
|
74
|
+
case "<=":
|
|
75
|
+
return testLE(columnMapOrFilter, filter);
|
|
76
|
+
case "ends":
|
|
77
|
+
return testEW(columnMapOrFilter, filter);
|
|
78
|
+
case "starts":
|
|
79
|
+
return testSW(columnMapOrFilter, filter);
|
|
80
|
+
case "contains":
|
|
81
|
+
return testContains(columnMapOrFilter, filter);
|
|
82
|
+
case "and":
|
|
83
|
+
return testAND(columnMapOrFilter, filter);
|
|
84
|
+
case "or":
|
|
85
|
+
return testOR(columnMapOrFilter, filter);
|
|
86
|
+
default:
|
|
87
|
+
console.log(`unrecognized filter type ${filter.op}`);
|
|
88
|
+
return ()=>true;
|
|
89
|
+
}
|
|
90
|
+
throw Error("[filterPredicate] invalid params");
|
|
91
|
+
}
|
|
92
|
+
const testInclude = (columnMap, filter)=>(row)=>-1 !== filter.values.indexOf(row[columnMap[filter.column]]);
|
|
93
|
+
const testDataRowInclude = (filter)=>(row)=>-1 !== filter.values.indexOf(row[filter.column]);
|
|
94
|
+
const testEQ = (columnMap, filter)=>{
|
|
95
|
+
if (isScaledDecimalFilterClause(filter)) return (row)=>row[columnMap[filter.column]] === filter.value.asLong;
|
|
96
|
+
return (row)=>row[columnMap[filter.column]] === filter.value;
|
|
97
|
+
};
|
|
98
|
+
const testDataRowEQ = (filter)=>(row)=>row[filter.column] === filter.value;
|
|
99
|
+
const testGT = (columnMap, filter)=>(row)=>row[columnMap[filter.column]] > filter.value;
|
|
100
|
+
const testDataRowGT = (filter)=>(row)=>row[filter.column] > filter.value;
|
|
101
|
+
const testGE = (columnMap, filter)=>(row)=>row[columnMap[filter.column]] >= filter.value;
|
|
102
|
+
const testDataRowGE = (filter)=>(row)=>row[filter.column] >= filter.value;
|
|
103
|
+
const testLT = (columnMap, filter)=>(row)=>row[columnMap[filter.column]] < filter.value;
|
|
104
|
+
const testDataRowLT = (filter)=>(row)=>row[filter.column] < filter.value;
|
|
105
|
+
const testLE = (columnMap, filter)=>(row)=>row[columnMap[filter.column]] <= filter.value;
|
|
106
|
+
const testDataRowLE = (filter)=>(row)=>row[filter.column] <= filter.value;
|
|
107
|
+
const testEW = (columnMap, filter)=>{
|
|
108
|
+
const filterValue = filter.value;
|
|
109
|
+
if ("string" != typeof filterValue) throw Error("string filter applied to value of wrong type");
|
|
110
|
+
return (row)=>{
|
|
111
|
+
const rowValue = row[columnMap[filter.column]];
|
|
112
|
+
if ("string" != typeof rowValue) throw Error("string filter applied to value of wrong type");
|
|
113
|
+
return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
const testDataRowEW = (filter)=>{
|
|
117
|
+
const filterValue = filter.value;
|
|
118
|
+
if ("string" != typeof filterValue) throw Error("string filter applied to value of wrong type");
|
|
119
|
+
return (row)=>{
|
|
120
|
+
const rowValue = row[filter.column];
|
|
121
|
+
if ("string" != typeof rowValue) throw Error("string filter applied to value of wrong type");
|
|
122
|
+
return rowValue.toLowerCase().endsWith(filterValue.toLowerCase());
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
const testSW = (columnMap, filter)=>{
|
|
126
|
+
const filterValue = filter.value;
|
|
127
|
+
if ("string" != typeof filterValue) throw Error("string filter applied to value of wrong type");
|
|
128
|
+
return (row)=>{
|
|
129
|
+
const rowValue = row[columnMap[filter.column]];
|
|
130
|
+
if ("string" != typeof rowValue) throw Error("string filter applied to value of wrong type");
|
|
131
|
+
return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
const testDataRowSW = (filter)=>{
|
|
135
|
+
const filterValue = filter.value;
|
|
136
|
+
if ("string" != typeof filterValue) throw Error("string filter applied to value of wrong type");
|
|
137
|
+
return (row)=>{
|
|
138
|
+
const rowValue = row[filter.column];
|
|
139
|
+
if ("string" != typeof rowValue) throw Error("string filter applied to value of wrong type");
|
|
140
|
+
return rowValue.toLowerCase().startsWith(filterValue.toLowerCase());
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
const testContains = (columnMap, filter)=>{
|
|
144
|
+
const filterValue = filter.value;
|
|
145
|
+
if ("string" != typeof filterValue) throw Error("string filter applied to value of wrong type");
|
|
146
|
+
return (row)=>{
|
|
147
|
+
const rowValue = row[columnMap[filter.column]];
|
|
148
|
+
if ("string" != typeof rowValue) throw Error("string filter applied to value of wrong type");
|
|
149
|
+
return rowValue.toLowerCase().includes(filterValue.toLowerCase());
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
const testDataRowContains = (filter)=>{
|
|
153
|
+
const filterValue = filter.value;
|
|
154
|
+
if ("string" != typeof filterValue) throw Error("string filter applied to value of wrong type");
|
|
155
|
+
return (row)=>{
|
|
156
|
+
const rowValue = row[filter.column];
|
|
157
|
+
if ("string" != typeof rowValue) throw Error("string filter applied to value of wrong type");
|
|
158
|
+
return rowValue.toLowerCase().includes(filterValue.toLowerCase());
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
const testAND = (columnMap, filter)=>{
|
|
162
|
+
const filters = filter.filters.map((f1)=>filterPredicate(columnMap, f1));
|
|
163
|
+
return (row)=>filters.every((fn)=>fn(row));
|
|
164
|
+
};
|
|
165
|
+
const testDataRowAND = (filter)=>{
|
|
166
|
+
const filters = filter.filters.map((f1)=>filterPredicate(f1));
|
|
167
|
+
return (row)=>filters.every((fn)=>fn(row));
|
|
168
|
+
};
|
|
169
|
+
function testOR(columnMap, filter) {
|
|
170
|
+
const filters = filter.filters.map((f1)=>filterPredicate(columnMap, f1));
|
|
171
|
+
return (row)=>filters.some((fn)=>fn(row));
|
|
172
|
+
}
|
|
173
|
+
function testDataRowOR(filter) {
|
|
174
|
+
const filters = filter.filters.map((f1)=>filterPredicate(f1));
|
|
175
|
+
return (row)=>filters.some((fn)=>fn(row));
|
|
176
|
+
}
|
|
177
|
+
export { filterPredicate, getFilterPredicate };
|
package/src/index.js
ADDED
|
@@ -1,28 +1 @@
|
|
|
1
|
-
export const Filter
|
|
2
|
-
export const ColumnValueExpression: 2;
|
|
3
|
-
export const Column: 3;
|
|
4
|
-
export const Operator: 4;
|
|
5
|
-
export const Eq: 5;
|
|
6
|
-
export const NotEq: 6;
|
|
7
|
-
export const Gt: 7;
|
|
8
|
-
export const Lt: 8;
|
|
9
|
-
export const Starts: 9;
|
|
10
|
-
export const Ends: 10;
|
|
11
|
-
export const Contains: 11;
|
|
12
|
-
export const Number: 12;
|
|
13
|
-
export const String: 13;
|
|
14
|
-
export const True: 14;
|
|
15
|
-
export const False: 15;
|
|
16
|
-
export const ColumnSetExpression: 16;
|
|
17
|
-
export const In: 17;
|
|
18
|
-
export const LBrack: 18;
|
|
19
|
-
export const Values: 19;
|
|
20
|
-
export const Comma: 20;
|
|
21
|
-
export const RBrack: 21;
|
|
22
|
-
export const AndExpression: 22;
|
|
23
|
-
export const And: 23;
|
|
24
|
-
export const OrExpression: 24;
|
|
25
|
-
export const Or: 25;
|
|
26
|
-
export const ParenthesizedExpression: 26;
|
|
27
|
-
export const As: 27;
|
|
28
|
-
export const FilterName: 28;
|
|
1
|
+
export declare const Filter = 1, ColumnValueExpression = 2, Column = 3, Operator = 4, Eq = 5, NotEq = 6, Gt = 7, Lt = 8, Starts = 9, Ends = 10, Contains = 11, Number = 12, String = 13, True = 14, False = 15, ColumnSetExpression = 16, In = 17, LBrack = 18, Values = 19, Comma = 20, RBrack = 21, AndExpression = 22, And = 23, OrExpression = 24, Or = 25, ParenthesizedExpression = 26, As = 27, FilterName = 28;
|
package/cjs/FilterParser.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var filterParser = require('./generated/filter-parser.js');
|
|
4
|
-
var FilterTreeWalker = require('./FilterTreeWalker.js');
|
|
5
|
-
|
|
6
|
-
const strictParser = filterParser.parser.configure({ strict: true });
|
|
7
|
-
const parseFilter = (filterQuery) => {
|
|
8
|
-
const parseTree = strictParser.parse(filterQuery);
|
|
9
|
-
const filter = FilterTreeWalker.walkTree(parseTree, filterQuery);
|
|
10
|
-
return filter;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
exports.parseFilter = parseFilter;
|
|
14
|
-
//# sourceMappingURL=FilterParser.js.map
|
package/cjs/FilterParser.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FilterParser.js","sources":["../../../packages/vuu-filter-parser/src/FilterParser.ts"],"sourcesContent":["import { Filter } from \"@vuu-ui/vuu-filter-types\";\nimport { parser } from \"./generated/filter-parser\";\nimport { walkTree } from \"./FilterTreeWalker\";\n\nconst strictParser = parser.configure({ strict: true });\n\nexport const parseFilter = (filterQuery: string): Filter => {\n const parseTree = strictParser.parse(filterQuery);\n const filter = walkTree(parseTree, filterQuery) as Filter;\n return filter;\n};\n"],"names":["parser","walkTree"],"mappings":";;;;;AAIA,MAAM,eAAeA,mBAAO,CAAA,SAAA,CAAU,EAAE,MAAA,EAAQ,MAAM,CAAA;AAEzC,MAAA,WAAA,GAAc,CAAC,WAAgC,KAAA;AAC1D,EAAM,MAAA,SAAA,GAAY,YAAa,CAAA,KAAA,CAAM,WAAW,CAAA;AAChD,EAAM,MAAA,MAAA,GAASC,yBAAS,CAAA,SAAA,EAAW,WAAW,CAAA;AAC9C,EAAO,OAAA,MAAA;AACT;;;;"}
|
package/cjs/FilterTreeWalker.js
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
|
-
|
|
5
|
-
var __defProp = Object.defineProperty;
|
|
6
|
-
var __typeError = (msg) => {
|
|
7
|
-
throw TypeError(msg);
|
|
8
|
-
};
|
|
9
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
|
|
11
|
-
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
12
|
-
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
|
|
13
|
-
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
14
|
-
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
15
|
-
var _filter;
|
|
16
|
-
class FilterExpression {
|
|
17
|
-
constructor() {
|
|
18
|
-
__publicField(this, "name");
|
|
19
|
-
__privateAdd(this, _filter);
|
|
20
|
-
}
|
|
21
|
-
setFilterCombinatorOp(op, filter = __privateGet(this, _filter)) {
|
|
22
|
-
if (vuuUtils.isMultiClauseFilter(filter) && filter.op === op) {
|
|
23
|
-
return;
|
|
24
|
-
} else {
|
|
25
|
-
__privateSet(this, _filter, {
|
|
26
|
-
op,
|
|
27
|
-
filters: [__privateGet(this, _filter)]
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
add(filter) {
|
|
32
|
-
if (__privateGet(this, _filter) === void 0) {
|
|
33
|
-
__privateSet(this, _filter, filter);
|
|
34
|
-
} else if (vuuUtils.isMultiClauseFilter(__privateGet(this, _filter))) {
|
|
35
|
-
__privateGet(this, _filter).filters.push(filter);
|
|
36
|
-
} else {
|
|
37
|
-
throw Error(`Invalid filter passed to FilterExpression`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
setColumn(column, filter = __privateGet(this, _filter)) {
|
|
41
|
-
if (vuuUtils.isMultiClauseFilter(filter)) {
|
|
42
|
-
const target = filter.filters.at(-1);
|
|
43
|
-
if (target) {
|
|
44
|
-
this.setColumn(column, target);
|
|
45
|
-
}
|
|
46
|
-
} else if (filter) {
|
|
47
|
-
filter.column = column;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
setOp(value, filter = __privateGet(this, _filter)) {
|
|
51
|
-
if (vuuUtils.isMultiClauseFilter(filter)) {
|
|
52
|
-
const target = filter.filters.at(-1);
|
|
53
|
-
if (target) {
|
|
54
|
-
this.setOp(value, target);
|
|
55
|
-
}
|
|
56
|
-
} else if (filter) {
|
|
57
|
-
filter.op = value;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
setValue(value, filter = __privateGet(this, _filter)) {
|
|
61
|
-
if (vuuUtils.isMultiClauseFilter(filter)) {
|
|
62
|
-
const target = filter.filters.at(-1);
|
|
63
|
-
if (target) {
|
|
64
|
-
this.setValue(value, target);
|
|
65
|
-
}
|
|
66
|
-
} else if (vuuUtils.isMultiValueFilter(filter)) {
|
|
67
|
-
filter.values ?? (filter.values = []);
|
|
68
|
-
filter.values.push(value);
|
|
69
|
-
} else if (vuuUtils.isSingleValueFilter(filter)) {
|
|
70
|
-
filter.value = value;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
toJSON(filter = __privateGet(this, _filter)) {
|
|
74
|
-
if (this.name) {
|
|
75
|
-
return {
|
|
76
|
-
...filter,
|
|
77
|
-
name: this.name
|
|
78
|
-
};
|
|
79
|
-
} else {
|
|
80
|
-
return filter;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
_filter = new WeakMap();
|
|
85
|
-
const walkTree = (tree, source) => {
|
|
86
|
-
const filterExpression = new FilterExpression();
|
|
87
|
-
const cursor = tree.cursor();
|
|
88
|
-
do {
|
|
89
|
-
const { name, from, to } = cursor;
|
|
90
|
-
switch (name) {
|
|
91
|
-
case "ColumnValueExpression":
|
|
92
|
-
filterExpression.add({});
|
|
93
|
-
break;
|
|
94
|
-
case "ColumnSetExpression":
|
|
95
|
-
filterExpression.add({ op: "in" });
|
|
96
|
-
break;
|
|
97
|
-
case "Or":
|
|
98
|
-
case "And":
|
|
99
|
-
filterExpression.setFilterCombinatorOp(source.substring(from, to));
|
|
100
|
-
break;
|
|
101
|
-
case "Column":
|
|
102
|
-
filterExpression.setColumn(source.substring(from, to));
|
|
103
|
-
break;
|
|
104
|
-
case "Operator":
|
|
105
|
-
filterExpression.setOp(source.substring(from, to));
|
|
106
|
-
break;
|
|
107
|
-
case "String":
|
|
108
|
-
filterExpression.setValue(source.substring(from + 1, to - 1));
|
|
109
|
-
break;
|
|
110
|
-
case "Number":
|
|
111
|
-
filterExpression.setValue(parseFloat(source.substring(from, to)));
|
|
112
|
-
break;
|
|
113
|
-
case "True":
|
|
114
|
-
filterExpression.setValue(true);
|
|
115
|
-
break;
|
|
116
|
-
case "False":
|
|
117
|
-
filterExpression.setValue(false);
|
|
118
|
-
break;
|
|
119
|
-
case "FilterName":
|
|
120
|
-
filterExpression.name = source.substring(from, to);
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
} while (cursor.next());
|
|
124
|
-
return filterExpression.toJSON();
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
exports.walkTree = walkTree;
|
|
128
|
-
//# sourceMappingURL=FilterTreeWalker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FilterTreeWalker.js","sources":["../../../packages/vuu-filter-parser/src/FilterTreeWalker.ts"],"sourcesContent":["import { Tree } from \"@lezer/common\";\nimport {\n Filter,\n FilterCombinatorOp,\n MultipleValueFilterClauseOp,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n isMultiClauseFilter,\n isMultiValueFilter,\n isSingleValueFilter,\n} from \"@vuu-ui/vuu-utils\";\n\nclass FilterExpression {\n public name: string | undefined;\n #filter: Partial<Filter> | undefined = undefined;\n\n setFilterCombinatorOp(op: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter) && filter.op === op) {\n return;\n } else {\n this.#filter = {\n op: op as FilterCombinatorOp,\n filters: [this.#filter as Filter],\n };\n }\n }\n\n add(filter: Partial<Filter>) {\n if (this.#filter === undefined) {\n this.#filter = filter;\n } else if (isMultiClauseFilter(this.#filter)) {\n this.#filter.filters.push(filter as Filter);\n } else {\n throw Error(`Invalid filter passed to FilterExpression`);\n }\n }\n\n setColumn(column: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setColumn(column, target);\n }\n } else if (filter) {\n filter.column = column;\n }\n }\n setOp(value: string, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setOp(value, target);\n }\n } else if (filter) {\n filter.op = value as\n | SingleValueFilterClauseOp\n | MultipleValueFilterClauseOp;\n }\n }\n setValue(value: string | number | boolean, filter = this.#filter) {\n if (isMultiClauseFilter(filter)) {\n const target = filter.filters.at(-1);\n if (target) {\n this.setValue(value, target);\n }\n } else if (isMultiValueFilter(filter)) {\n filter.values ??= [];\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filter.values.push(value);\n } else if (isSingleValueFilter(filter)) {\n filter.value = value;\n }\n }\n\n toJSON(filter = this.#filter) {\n if (this.name) {\n return {\n ...filter,\n name: this.name,\n };\n } else {\n return filter;\n }\n }\n}\n\nexport const walkTree = (tree: Tree, source: string) => {\n const filterExpression = new FilterExpression();\n const cursor = tree.cursor();\n do {\n const { name, from, to } = cursor;\n switch (name) {\n case \"ColumnValueExpression\":\n filterExpression.add({});\n break;\n case \"ColumnSetExpression\":\n filterExpression.add({ op: \"in\" });\n break;\n\n case \"Or\":\n case \"And\":\n filterExpression.setFilterCombinatorOp(source.substring(from, to));\n break;\n\n case \"Column\":\n filterExpression.setColumn(source.substring(from, to));\n break;\n\n case \"Operator\":\n filterExpression.setOp(source.substring(from, to));\n break;\n\n case \"String\":\n filterExpression.setValue(source.substring(from + 1, to - 1));\n break;\n\n case \"Number\":\n filterExpression.setValue(parseFloat(source.substring(from, to)));\n break;\n\n case \"True\":\n filterExpression.setValue(true);\n break;\n\n case \"False\":\n filterExpression.setValue(false);\n break;\n\n case \"FilterName\":\n filterExpression.name = source.substring(from, to);\n break;\n\n default:\n }\n } while (cursor.next());\n\n return filterExpression.toJSON();\n};\n"],"names":["isMultiClauseFilter","isMultiValueFilter","isSingleValueFilter"],"mappings":";;;;;;;;;;;;;;AAAA,IAAA,OAAA;AAaA,MAAM,gBAAiB,CAAA;AAAA,EAAvB,WAAA,GAAA;AACE,IAAO,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AACP,IAAA,YAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA;AAAA,EAEA,qBAAsB,CAAA,EAAA,EAAY,MAAS,GAAA,YAAA,CAAA,IAAA,EAAK,OAAS,CAAA,EAAA;AACvD,IAAA,IAAIA,4BAAoB,CAAA,MAAM,CAAK,IAAA,MAAA,CAAO,OAAO,EAAI,EAAA;AACnD,MAAA;AAAA,KACK,MAAA;AACL,MAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA;AAAA,QACb,EAAA;AAAA,QACA,OAAA,EAAS,CAAC,YAAA,CAAA,IAAA,EAAK,OAAiB,CAAA;AAAA,OAClC,CAAA;AAAA;AACF;AACF,EAEA,IAAI,MAAyB,EAAA;AAC3B,IAAI,IAAA,YAAA,CAAA,IAAA,EAAK,aAAY,KAAW,CAAA,EAAA;AAC9B,MAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA,MAAA,CAAA;AAAA,KACN,MAAA,IAAAA,4BAAA,CAAoB,YAAK,CAAA,IAAA,EAAA,OAAA,CAAO,CAAG,EAAA;AAC5C,MAAK,YAAA,CAAA,IAAA,EAAA,OAAA,CAAA,CAAQ,OAAQ,CAAA,IAAA,CAAK,MAAgB,CAAA;AAAA,KACrC,MAAA;AACL,MAAA,MAAM,MAAM,CAA2C,yCAAA,CAAA,CAAA;AAAA;AACzD;AACF,EAEA,SAAU,CAAA,MAAA,EAAgB,MAAS,GAAA,YAAA,CAAA,IAAA,EAAK,OAAS,CAAA,EAAA;AAC/C,IAAI,IAAAA,4BAAA,CAAoB,MAAM,CAAG,EAAA;AAC/B,MAAA,MAAM,MAAS,GAAA,MAAA,CAAO,OAAQ,CAAA,EAAA,CAAG,CAAE,CAAA,CAAA;AACnC,MAAA,IAAI,MAAQ,EAAA;AACV,QAAK,IAAA,CAAA,SAAA,CAAU,QAAQ,MAAM,CAAA;AAAA;AAC/B,eACS,MAAQ,EAAA;AACjB,MAAA,MAAA,CAAO,MAAS,GAAA,MAAA;AAAA;AAClB;AACF,EACA,KAAM,CAAA,KAAA,EAAe,MAAS,GAAA,YAAA,CAAA,IAAA,EAAK,OAAS,CAAA,EAAA;AAC1C,IAAI,IAAAA,4BAAA,CAAoB,MAAM,CAAG,EAAA;AAC/B,MAAA,MAAM,MAAS,GAAA,MAAA,CAAO,OAAQ,CAAA,EAAA,CAAG,CAAE,CAAA,CAAA;AACnC,MAAA,IAAI,MAAQ,EAAA;AACV,QAAK,IAAA,CAAA,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA;AAC1B,eACS,MAAQ,EAAA;AACjB,MAAA,MAAA,CAAO,EAAK,GAAA,KAAA;AAAA;AAGd;AACF,EACA,QAAS,CAAA,KAAA,EAAkC,MAAS,GAAA,YAAA,CAAA,IAAA,EAAK,OAAS,CAAA,EAAA;AAChE,IAAI,IAAAA,4BAAA,CAAoB,MAAM,CAAG,EAAA;AAC/B,MAAA,MAAM,MAAS,GAAA,MAAA,CAAO,OAAQ,CAAA,EAAA,CAAG,CAAE,CAAA,CAAA;AACnC,MAAA,IAAI,MAAQ,EAAA;AACV,QAAK,IAAA,CAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA;AAC7B,KACF,MAAA,IAAWC,2BAAmB,CAAA,MAAM,CAAG,EAAA;AACrC,MAAO,MAAA,CAAA,MAAA,KAAP,MAAO,CAAA,MAAA,GAAW,EAAC,CAAA;AAGnB,MAAO,MAAA,CAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,KAC1B,MAAA,IAAWC,4BAAoB,CAAA,MAAM,CAAG,EAAA;AACtC,MAAA,MAAA,CAAO,KAAQ,GAAA,KAAA;AAAA;AACjB;AACF,EAEA,MAAA,CAAO,MAAS,GAAA,YAAA,CAAA,IAAA,EAAK,OAAS,CAAA,EAAA;AAC5B,IAAA,IAAI,KAAK,IAAM,EAAA;AACb,MAAO,OAAA;AAAA,QACL,GAAG,MAAA;AAAA,QACH,MAAM,IAAK,CAAA;AAAA,OACb;AAAA,KACK,MAAA;AACL,MAAO,OAAA,MAAA;AAAA;AACT;AAEJ;AAvEE,OAAA,GAAA,IAAA,OAAA,EAAA;AAyEW,MAAA,QAAA,GAAW,CAAC,IAAA,EAAY,MAAmB,KAAA;AACtD,EAAM,MAAA,gBAAA,GAAmB,IAAI,gBAAiB,EAAA;AAC9C,EAAM,MAAA,MAAA,GAAS,KAAK,MAAO,EAAA;AAC3B,EAAG,GAAA;AACD,IAAA,MAAM,EAAE,IAAA,EAAM,IAAM,EAAA,EAAA,EAAO,GAAA,MAAA;AAC3B,IAAA,QAAQ,IAAM;AAAA,MACZ,KAAK,uBAAA;AACH,QAAiB,gBAAA,CAAA,GAAA,CAAI,EAAE,CAAA;AACvB,QAAA;AAAA,MACF,KAAK,qBAAA;AACH,QAAA,gBAAA,CAAiB,GAAI,CAAA,EAAE,EAAI,EAAA,IAAA,EAAM,CAAA;AACjC,QAAA;AAAA,MAEF,KAAK,IAAA;AAAA,MACL,KAAK,KAAA;AACH,QAAA,gBAAA,CAAiB,qBAAsB,CAAA,MAAA,CAAO,SAAU,CAAA,IAAA,EAAM,EAAE,CAAC,CAAA;AACjE,QAAA;AAAA,MAEF,KAAK,QAAA;AACH,QAAA,gBAAA,CAAiB,SAAU,CAAA,MAAA,CAAO,SAAU,CAAA,IAAA,EAAM,EAAE,CAAC,CAAA;AACrD,QAAA;AAAA,MAEF,KAAK,UAAA;AACH,QAAA,gBAAA,CAAiB,KAAM,CAAA,MAAA,CAAO,SAAU,CAAA,IAAA,EAAM,EAAE,CAAC,CAAA;AACjD,QAAA;AAAA,MAEF,KAAK,QAAA;AACH,QAAA,gBAAA,CAAiB,SAAS,MAAO,CAAA,SAAA,CAAU,OAAO,CAAG,EAAA,EAAA,GAAK,CAAC,CAAC,CAAA;AAC5D,QAAA;AAAA,MAEF,KAAK,QAAA;AACH,QAAA,gBAAA,CAAiB,SAAS,UAAW,CAAA,MAAA,CAAO,UAAU,IAAM,EAAA,EAAE,CAAC,CAAC,CAAA;AAChE,QAAA;AAAA,MAEF,KAAK,MAAA;AACH,QAAA,gBAAA,CAAiB,SAAS,IAAI,CAAA;AAC9B,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,gBAAA,CAAiB,SAAS,KAAK,CAAA;AAC/B,QAAA;AAAA,MAEF,KAAK,YAAA;AACH,QAAA,gBAAA,CAAiB,IAAO,GAAA,MAAA,CAAO,SAAU,CAAA,IAAA,EAAM,EAAE,CAAA;AACjD,QAAA;AAEF;AACF,GACF,QAAS,OAAO,IAAK,EAAA;AAErB,EAAA,OAAO,iBAAiB,MAAO,EAAA;AACjC;;;;"}
|