@malloydata/malloy-filter 0.0.421 → 0.0.423
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/dist/boolean_filter_expression.js +4 -1
- package/dist/boolean_filter_expression.js.map +1 -1
- package/dist/clause_utils.js +4 -1
- package/dist/clause_utils.js.map +1 -1
- package/dist/filter_interface.d.ts +6 -4
- package/dist/filter_interface.js +4 -1
- package/dist/filter_interface.js.map +1 -1
- package/dist/lib/fexpr_number_parser.js +283 -231
- package/dist/lib/fexpr_number_parser.js.map +1 -1
- package/dist/lib/ftemporal_parser.js +305 -253
- package/dist/lib/ftemporal_parser.js.map +1 -1
- package/dist/number_filter_expression.js +3 -0
- package/dist/number_filter_expression.js.map +1 -1
- package/dist/string_filter_expression.js +2 -0
- package/dist/string_filter_expression.js.map +1 -1
- package/dist/temporal_filter_expression.js +3 -1
- package/dist/temporal_filter_expression.js.map +1 -1
- package/package.json +1 -1
- package/src/boolean_filter_expression.ts +3 -1
- package/src/clause_utils.ts +4 -1
- package/src/filter_interface.ts +13 -2
- package/src/grammars/fexpr_number.peggy +2 -0
- package/src/grammars/ftemporal.peggy +2 -0
- package/src/lib/fexpr_number_parser.js +252 -203
- package/src/lib/ftemporal_parser.js +291 -242
- package/src/number_filter_expression.ts +3 -0
- package/src/string_filter_expression.ts +2 -0
- package/src/temporal_filter_expression.ts +6 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temporal_filter_expression.js","sourceRoot":"","sources":["../src/temporal_filter_expression.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,yDAAoD;AACpD,6DAAoE;AACpE,+CAAyC;AAE5B,QAAA,wBAAwB,GAAG;IACtC,KAAK,CAAC,GAAW;QACf,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAC,CAAC;QACjC,CAAC;QACD,MAAM,YAAY,GAAG,IAAA,wBAAU,EAAC,GAAG,EAAE,wBAAmB,CAAC,CAAC;QAC1D,IAAI,YAAY,CAAC,MAAM,IAAI,IAAA,mCAAgB,EAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,OAAO,EAAC,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,EAAC,CAAC;QAChD,CAAC;QACD,OAAO,EAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAC,CAAC;IAC/C,CAAC;IACD,OAAO,CAAC,EAAyB;QAC/B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,OAAO,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC5B,KAAK,IAAI,CAAC,CAAC,CAAC;gBACV,OAAO,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,KAAK,IAAI;gBACP,OAAO,GAAG,GAAG,gCAAwB,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"temporal_filter_expression.js","sourceRoot":"","sources":["../src/temporal_filter_expression.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -27,12 +27,14 @@ export const BooleanFilterExpression = {
|
|
|
27
27
|
ret.parsed = {operator: '=false'};
|
|
28
28
|
} else if (src === 'null') {
|
|
29
29
|
ret.parsed = {operator: 'null'};
|
|
30
|
+
} else if (src === 'none') {
|
|
31
|
+
ret.parsed = {operator: 'none'};
|
|
30
32
|
} else {
|
|
31
33
|
const nonSpace = srcText.match(/[^\s]/);
|
|
32
34
|
const startIndex = nonSpace ? (nonSpace.index ?? 0) : 0;
|
|
33
35
|
ret.log = [
|
|
34
36
|
{
|
|
35
|
-
message: `Illegal boolean filter '${src}'. Must be one of true,=true,false,=false,null`,
|
|
37
|
+
message: `Illegal boolean filter '${src}'. Must be one of true,=true,false,=false,null,none`,
|
|
36
38
|
severity: 'error',
|
|
37
39
|
startIndex,
|
|
38
40
|
endIndex: startIndex + srcText.length - 1,
|
package/src/clause_utils.ts
CHANGED
|
@@ -40,7 +40,7 @@ export function unescape(str: string) {
|
|
|
40
40
|
*/
|
|
41
41
|
export function escape(str: string) {
|
|
42
42
|
const lstr = str.toLowerCase();
|
|
43
|
-
if (lstr === 'null' || lstr === 'empty') {
|
|
43
|
+
if (lstr === 'null' || lstr === 'empty' || lstr === 'none') {
|
|
44
44
|
return '\\' + str;
|
|
45
45
|
}
|
|
46
46
|
return str.replace(/([,; |()\\%_-])/g, '\\$1');
|
|
@@ -138,6 +138,9 @@ export function matchOp(matchSrc: string): StringFilter {
|
|
|
138
138
|
if (matchTxt.toLowerCase() === 'empty') {
|
|
139
139
|
return {operator: 'empty'};
|
|
140
140
|
}
|
|
141
|
+
if (matchTxt.toLowerCase() === 'none') {
|
|
142
|
+
return {operator: 'none'};
|
|
143
|
+
}
|
|
141
144
|
return {operator: '=', values: [unescape(matchTxt)]};
|
|
142
145
|
}
|
|
143
146
|
|
package/src/filter_interface.ts
CHANGED
|
@@ -13,6 +13,11 @@ interface Negatable {
|
|
|
13
13
|
|
|
14
14
|
export interface Null extends FilterOperator<'null'>, Negatable {}
|
|
15
15
|
|
|
16
|
+
// The "always false" filter — matches nothing. Companion to the empty filter
|
|
17
|
+
// `f''` (which is the null/absent filter, "always true"). Universal across all
|
|
18
|
+
// filter types. `not none` is "always true".
|
|
19
|
+
export interface None extends FilterOperator<'none'>, Negatable {}
|
|
20
|
+
|
|
16
21
|
export type ChainOp = 'and' | 'or' | ',';
|
|
17
22
|
export function isChainOp(s: string): s is ChainOp {
|
|
18
23
|
return ['and', 'or', ','].includes(s);
|
|
@@ -51,6 +56,7 @@ export type StringFilter =
|
|
|
51
56
|
| StringCondition
|
|
52
57
|
| StringMatch
|
|
53
58
|
| Null
|
|
59
|
+
| None
|
|
54
60
|
| StringEmpty
|
|
55
61
|
| ClauseChain<StringFilter>
|
|
56
62
|
| ClauseGroup<StringFilter>;
|
|
@@ -68,6 +74,7 @@ export function isStringFilter(sc: unknown): sc is StringFilter {
|
|
|
68
74
|
'=',
|
|
69
75
|
'~',
|
|
70
76
|
'null',
|
|
77
|
+
'none',
|
|
71
78
|
'empty',
|
|
72
79
|
'and',
|
|
73
80
|
'or',
|
|
@@ -83,7 +90,7 @@ export interface BooleanCondition extends Negatable {
|
|
|
83
90
|
operator: BooleanOperator;
|
|
84
91
|
}
|
|
85
92
|
|
|
86
|
-
export type BooleanFilter = BooleanCondition | Null;
|
|
93
|
+
export type BooleanFilter = BooleanCondition | Null | None;
|
|
87
94
|
|
|
88
95
|
export function isBooleanFilter(bc: unknown): bc is BooleanFilter {
|
|
89
96
|
return (
|
|
@@ -91,7 +98,7 @@ export function isBooleanFilter(bc: unknown): bc is BooleanFilter {
|
|
|
91
98
|
bc !== null &&
|
|
92
99
|
'operator' in bc &&
|
|
93
100
|
typeof bc.operator === 'string' &&
|
|
94
|
-
['null', 'true', 'false', '=false', '=true'].includes(bc.operator)
|
|
101
|
+
['null', 'none', 'true', 'false', '=false', '=true'].includes(bc.operator)
|
|
95
102
|
);
|
|
96
103
|
}
|
|
97
104
|
|
|
@@ -115,6 +122,7 @@ export type NumberFilter =
|
|
|
115
122
|
| NumberCondition
|
|
116
123
|
| NumberRange
|
|
117
124
|
| Null
|
|
125
|
+
| None
|
|
118
126
|
| ClauseGroup<NumberFilter>
|
|
119
127
|
| BooleanChain<NumberFilter>;
|
|
120
128
|
|
|
@@ -136,6 +144,7 @@ export function isNumberFilter(sc: unknown): sc is NumberFilter {
|
|
|
136
144
|
'or',
|
|
137
145
|
'()',
|
|
138
146
|
'null',
|
|
147
|
+
'none',
|
|
139
148
|
].includes(sc.operator)
|
|
140
149
|
);
|
|
141
150
|
}
|
|
@@ -234,6 +243,7 @@ export interface InMoment extends FilterOperator<'in'>, Negatable {
|
|
|
234
243
|
|
|
235
244
|
export type TemporalFilter =
|
|
236
245
|
| Null
|
|
246
|
+
| None
|
|
237
247
|
| Before
|
|
238
248
|
| After
|
|
239
249
|
| To
|
|
@@ -265,6 +275,7 @@ export function isTemporalFilter(sc: unknown): sc is TemporalFilter {
|
|
|
265
275
|
'next',
|
|
266
276
|
'()',
|
|
267
277
|
'null',
|
|
278
|
+
'none',
|
|
268
279
|
].includes(sc.operator)
|
|
269
280
|
);
|
|
270
281
|
}
|
|
@@ -19,6 +19,7 @@ numberUnary
|
|
|
19
19
|
|
|
20
20
|
clause
|
|
21
21
|
= NULL { return {operator: 'null'}; }
|
|
22
|
+
/ NONE { return {operator: 'none'}; }
|
|
22
23
|
/ "(" _ expr:numberFilter _ ")" { return {operator: "()", expr}; }
|
|
23
24
|
/ open:openInterval _ b:N _ TO _ e:N _ close:closeInterval { return mkRange(open, b, e, close); }
|
|
24
25
|
/ "!=" _ n:N nList:(_ "," _ N)* { return {operator: '!=', ...mkValues(n, nList.map(x => x[3]))}; }
|
|
@@ -37,6 +38,7 @@ conjunction
|
|
|
37
38
|
|
|
38
39
|
NOT = "not"i !idChar { return "not"; }
|
|
39
40
|
NULL = "null"i !idChar
|
|
41
|
+
NONE = "none"i !idChar
|
|
40
42
|
AND = "and"i !idChar
|
|
41
43
|
OR = "or"i !idChar
|
|
42
44
|
TO = "to"i !idChar
|
|
@@ -19,6 +19,7 @@ temporalUnary
|
|
|
19
19
|
|
|
20
20
|
clause
|
|
21
21
|
= NULL { return {operator: 'null'}; }
|
|
22
|
+
/ NONE { return {operator: 'none'}; }
|
|
22
23
|
/ "(" _ expr:temporalFilter _ ")" { return {operator: "()", expr}; }
|
|
23
24
|
/ BEFORE __ m:moment { return {operator: 'before', before: m}; }
|
|
24
25
|
/ STARTING __ m:moment { return {operator: 'before', before: m, not: true}; }
|
|
@@ -80,6 +81,7 @@ conjunction
|
|
|
80
81
|
// Keywords - case insensitive, must not be followed by more id chars
|
|
81
82
|
NOT = "not"i !idChar
|
|
82
83
|
NULL = "null"i !idChar
|
|
84
|
+
NONE = "none"i !idChar
|
|
83
85
|
TO = "to"i !idChar
|
|
84
86
|
NOW = "now"i !idChar
|
|
85
87
|
LAST = "last"i !idChar
|