@vuu-ui/vuu-filter-parser 4.1.0 → 4.1.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,25 +1,24 @@
1
1
  {
2
- "version": "4.1.0",
2
+ "version": "4.1.1",
3
3
  "main": "./src/index.js",
4
4
  "author": "heswell",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "scripts": {
8
8
  "prebuild": "npm run lezer-generate:filter",
9
- "build:dev": "node ../../scripts/run-build.mjs",
10
9
  "build": "node ../../scripts/run-build-rslib.ts",
11
10
  "lezer-generate:filter": "lezer-generator --output ./src/generated/filter-parser.js ./src/grammar/filter.grammar",
12
11
  "type-defs": "node ../../scripts/build-type-defs.mjs"
13
12
  },
14
13
  "devDependencies": {
15
- "@vuu-ui/vuu-data-types": "4.1.0",
16
- "@vuu-ui/vuu-filter-types": "4.1.0",
17
- "@vuu-ui/vuu-table-types": "4.1.0"
14
+ "@vuu-ui/vuu-data-types": "4.1.1",
15
+ "@vuu-ui/vuu-filter-types": "4.1.1",
16
+ "@vuu-ui/vuu-table-types": "4.1.1"
18
17
  },
19
18
  "dependencies": {
20
19
  "@lezer/common": "^1.0.2",
21
20
  "@lezer/lr": "1.4.2",
22
- "@vuu-ui/vuu-utils": "4.1.0"
21
+ "@vuu-ui/vuu-utils": "4.1.1"
23
22
  },
24
23
  "files": [
25
24
  "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 testDataRowLE(columnMapOrFilter);
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('unrecognized filter type', unreachable);
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 testLE(columnMapOrFilter, filter);
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('unrecognized filter type', unreachable);
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 testInclude = (columnMap, filter)=>(row)=>-1 !== filter.values.indexOf(row[columnMap[filter.column]]);
135
- const testDataRowInclude = (filter)=>(row)=>-1 !== filter.values.indexOf(row[filter.column]);
136
- const testEQ = (columnMap, filter)=>{
137
- if (isScaledDecimalFilterClause(filter)) return (row)=>row[columnMap[filter.column]] === filter.value.asLong;
138
- return (row)=>row[columnMap[filter.column]] === filter.value;
139
- };
140
- const testNE = (columnMap, filter)=>{
141
- if (isScaledDecimalFilterClause(filter)) return (row)=>row[columnMap[filter.column]] !== filter.value.asLong;
142
- return (row)=>row[columnMap[filter.column]] !== filter.value;
143
- };
144
- const testDataRowEQ = (filter)=>(row)=>row[filter.column] === filter.value;
145
- const testDataRowNE = (filter)=>(row)=>row[filter.column] !== filter.value;
146
- const testGT = (columnMap, filter)=>(row)=>row[columnMap[filter.column]] > filter.value;
147
- const testDataRowGT = (filter)=>(row)=>row[filter.column] > filter.value;
148
- const testGE = (columnMap, filter)=>(row)=>row[columnMap[filter.column]] >= filter.value;
149
- const testDataRowGE = (filter)=>(row)=>row[filter.column] >= filter.value;
150
- const testLT = (columnMap, filter)=>(row)=>row[columnMap[filter.column]] < filter.value;
151
- const testDataRowLT = (filter)=>(row)=>row[filter.column] < filter.value;
152
- const testLE = (columnMap, filter)=>(row)=>row[columnMap[filter.column]] <= filter.value;
153
- const testDataRowLE = (filter)=>(row)=>row[filter.column] <= filter.value;
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");
@@ -1,8 +1,8 @@
1
- import { DataSourceRowWithBigint } from "@vuu-ui/vuu-data-types";
2
- import { ColumnDescriptorsByName, Filter } from "@vuu-ui/vuu-filter-types";
3
- import { ColumnMap } from "@vuu-ui/vuu-utils";
4
- import { VuuDataRow } from "@vuu-ui/vuu-protocol-types";
5
- import { DataRow } from "@vuu-ui/vuu-table-types";
1
+ import type { DataSourceRowWithBigint } from "@vuu-ui/vuu-data-types";
2
+ import type { ColumnDescriptorsByName, Filter } from "@vuu-ui/vuu-filter-types";
3
+ import { type ColumnMap } from "@vuu-ui/vuu-utils";
4
+ import type { VuuDataRow } from "@vuu-ui/vuu-protocol-types";
5
+ import type { DataRow } from "@vuu-ui/vuu-table-types";
6
6
  export type FilterPredicate = (row: DataSourceRowWithBigint | VuuDataRow) => boolean;
7
7
  export type DataRowFilterPredicate = (row: DataRow) => boolean;
8
8
  export declare function getFilterPredicate(columnMap: ColumnMap, filterQuery: string): FilterPredicate;