@malloydata/malloy-filter 0.0.237 → 0.0.238-dev250226004650

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.
Files changed (52) hide show
  1. package/dist/a_simple_parser.d.ts +1 -0
  2. package/dist/a_simple_parser.js +29 -0
  3. package/dist/a_simple_parser.js.map +1 -0
  4. package/dist/base_parser.d.ts +11 -0
  5. package/dist/base_parser.js +39 -0
  6. package/dist/base_parser.js.map +1 -0
  7. package/dist/boolean_parser.d.ts +7 -0
  8. package/dist/boolean_parser.js +76 -0
  9. package/dist/boolean_parser.js.map +1 -0
  10. package/dist/boolean_serializer.d.ts +8 -0
  11. package/dist/boolean_serializer.js +45 -0
  12. package/dist/boolean_serializer.js.map +1 -0
  13. package/dist/clause_types.d.ts +68 -0
  14. package/dist/clause_types.js +9 -0
  15. package/dist/clause_types.js.map +1 -0
  16. package/dist/date_parser.d.ts +25 -0
  17. package/dist/date_parser.js +434 -0
  18. package/dist/date_parser.js.map +1 -0
  19. package/dist/date_serializer.d.ts +11 -0
  20. package/dist/date_serializer.js +94 -0
  21. package/dist/date_serializer.js.map +1 -0
  22. package/dist/date_types.d.ts +75 -0
  23. package/dist/date_types.js +9 -0
  24. package/dist/date_types.js.map +1 -0
  25. package/dist/generate_samples.d.ts +1 -0
  26. package/dist/generate_samples.js +334 -0
  27. package/dist/generate_samples.js.map +1 -0
  28. package/dist/index.d.ts +10 -0
  29. package/dist/index.js +42 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/number_parser.d.ts +17 -0
  32. package/dist/number_parser.js +252 -0
  33. package/dist/number_parser.js.map +1 -0
  34. package/dist/number_serializer.d.ts +11 -0
  35. package/dist/number_serializer.js +85 -0
  36. package/dist/number_serializer.js.map +1 -0
  37. package/dist/string_parser.d.ts +17 -0
  38. package/dist/string_parser.js +166 -0
  39. package/dist/string_parser.js.map +1 -0
  40. package/dist/string_serializer.d.ts +13 -0
  41. package/dist/string_serializer.js +107 -0
  42. package/dist/string_serializer.js.map +1 -0
  43. package/dist/token_types.d.ts +7 -0
  44. package/dist/token_types.js +9 -0
  45. package/dist/token_types.js.map +1 -0
  46. package/dist/tokenizer.d.ts +52 -0
  47. package/dist/tokenizer.js +269 -0
  48. package/dist/tokenizer.js.map +1 -0
  49. package/dist/tokenizer.spec.d.ts +1 -0
  50. package/dist/tokenizer.spec.js +261 -0
  51. package/dist/tokenizer.spec.js.map +1 -0
  52. package/package.json +1 -1
@@ -0,0 +1,434 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DateParser = void 0;
10
+ const tokenizer_1 = require("./tokenizer");
11
+ const base_parser_1 = require("./base_parser");
12
+ class DateParser extends base_parser_1.BaseParser {
13
+ constructor(input) {
14
+ super(input);
15
+ }
16
+ tokenize() {
17
+ const specialSubstrings = [{ type: ',', value: ',' }];
18
+ // Do not reorder.
19
+ const specialWords = [
20
+ {
21
+ type: 'unitoftime',
22
+ value: /^(second|minute|hour|day|week|month|quarter|year)s?$/i,
23
+ ignoreCase: true,
24
+ },
25
+ {
26
+ type: 'dayofweek',
27
+ value: /^(monday|tuesday|wednesday|thursday|friday|saturday|sunday)$/i,
28
+ ignoreCase: true,
29
+ },
30
+ { type: 'date', value: /^\d{4}-\d{2}-\d{2}T\d\d$/ },
31
+ { type: 'date', value: /^\d{4}-\d{2}-\d{2}$/ },
32
+ { type: 'date', value: /^\d{4}-\d{2}$/ },
33
+ { type: 'date', value: /^\d{4}-[Qq][1234]$/ },
34
+ {
35
+ type: 'date',
36
+ value: /^\d{4}-\d{2}-\d{2}T\d\d:\d\d:\d\d\[[a-zA-Z_/]*\]$/,
37
+ },
38
+ { type: 'date', value: /^\d{4}-\d{2}-\d{2}T\d\d:\d\d:\d\d[.,]\d+$/ },
39
+ { type: 'date', value: /^\d{4}-\d{2}-\d{2}T\d\d:\d\d:\d\d$/ },
40
+ { type: 'date', value: /^\d{4}-\d{2}-\d{2}T\d\d:\d\d$/ },
41
+ { type: 'time', value: /^\d\d:\d\d:\d\d\[[a-zA-Z_/]*\]$/ },
42
+ { type: 'time', value: /^\d\d:\d\d:\d\d[.,]\d+$/ },
43
+ { type: 'time', value: /^\d\d:\d\d:\d\d$/ },
44
+ { type: 'time', value: /^\d\d:\d\d$/ },
45
+ { type: 'not_null', value: '-null', ignoreCase: true },
46
+ { type: 'null', value: 'null', ignoreCase: true },
47
+ { type: 'prefix', value: /^(before|after)/i, ignoreCase: true },
48
+ { type: 'today', value: 'today', ignoreCase: true },
49
+ { type: 'yesterday', value: 'yesterday', ignoreCase: true },
50
+ { type: 'tomorrow', value: 'tomorrow', ignoreCase: true },
51
+ { type: 'now', value: 'now', ignoreCase: true },
52
+ { type: 'this', value: 'this', ignoreCase: true },
53
+ { type: 'last', value: 'last', ignoreCase: true },
54
+ { type: 'next', value: 'next', ignoreCase: true },
55
+ { type: 'ago', value: 'ago', ignoreCase: true },
56
+ { type: 'from', value: 'from', ignoreCase: true },
57
+ { type: 'for', value: 'for', ignoreCase: true },
58
+ { type: 'to', value: 'to', ignoreCase: true },
59
+ { type: 'year', value: /^\d\d\d\d$/ },
60
+ { type: 'number', value: /^[\d.]+/, ignoreCase: true },
61
+ ];
62
+ const params = {
63
+ trimWordWhitespace: true,
64
+ splitOnWhitespace: true,
65
+ specialSubstrings,
66
+ specialWords,
67
+ };
68
+ const tokenizer = new tokenizer_1.Tokenizer(this.inputString, params);
69
+ this.tokens = tokenizer.parse();
70
+ this.tokens = this.mergeDateTimeTokens();
71
+ this.tokens = this.mergeMomentTokens();
72
+ }
73
+ mergeDateTimeTokens() {
74
+ const output = [];
75
+ this.index = 0;
76
+ let previous = undefined;
77
+ while (this.index < this.tokens.length) {
78
+ const token = this.tokens[this.index];
79
+ if (previous &&
80
+ previous.type === 'date' &&
81
+ previous.value.length >= 10 &&
82
+ (token.type === 'time' ||
83
+ (token.type === 'number' && token.value.length === 2))) {
84
+ previous.value = previous.value + ' ' + token.value;
85
+ previous.endIndex = token.endIndex;
86
+ previous = undefined;
87
+ }
88
+ else {
89
+ previous = token;
90
+ output.push(token);
91
+ }
92
+ this.index++;
93
+ }
94
+ return output;
95
+ }
96
+ mergeMomentTokens() {
97
+ const output = [];
98
+ this.index = 0;
99
+ while (this.index < this.tokens.length) {
100
+ // Do not reorder.
101
+ if (this.matchAndMerge('last|unitoftime', output) ||
102
+ this.matchAndMerge('last|dayofweek', output) ||
103
+ this.matchAndMerge('last|number|unitoftime', output) ||
104
+ this.matchAndMerge('last|year|unitoftime', output) ||
105
+ this.matchAndMerge('this|unitoftime', output) ||
106
+ this.matchAndMerge('next|unitoftime', output) ||
107
+ this.matchAndMerge('next|dayofweek', output) ||
108
+ this.matchAndMerge('next|number|unitoftime', output) ||
109
+ this.matchAndMerge('next|year|unitoftime', output) ||
110
+ this.matchAndMerge('number|unitoftime|ago', output) ||
111
+ this.matchAndMerge('year|unitoftime|ago', output) ||
112
+ this.matchAndMerge('number|unitoftime|from|now', output) ||
113
+ this.matchAndMerge('year|unitoftime|from|now', output) ||
114
+ this.matchAndMerge('number|unitoftime', output) ||
115
+ this.matchAndMerge('year|unitoftime', output) ||
116
+ this.matchAndMerge('today', output) ||
117
+ this.matchAndMerge('yesterday', output) ||
118
+ this.matchAndMerge('tomorrow', output) ||
119
+ this.matchAndMerge('date', output) ||
120
+ this.matchAndMerge('year', output) ||
121
+ this.matchAndMerge('now', output)) {
122
+ continue;
123
+ }
124
+ else {
125
+ output.push(this.tokens[this.index]);
126
+ this.index++;
127
+ }
128
+ }
129
+ return output;
130
+ }
131
+ matchAndMerge(types, output) {
132
+ const idx = this.index;
133
+ const matchedTokens = tokenizer_1.Tokenizer.matchTypes(types, this.tokens, idx);
134
+ if (matchedTokens) {
135
+ output.push({
136
+ type: 'MERGE:' + types,
137
+ value: '',
138
+ values: matchedTokens,
139
+ startIndex: matchedTokens[0].startIndex,
140
+ endIndex: matchedTokens[matchedTokens.length - 1].endIndex,
141
+ });
142
+ this.index += matchedTokens.length;
143
+ return true;
144
+ }
145
+ return false;
146
+ }
147
+ parse() {
148
+ this.tokenize();
149
+ let prefix = undefined;
150
+ const clauses = [];
151
+ const logs = [];
152
+ this.index = 0;
153
+ while (this.index < this.tokens.length) {
154
+ const token = this.getNext();
155
+ if (token.type === ',') {
156
+ if (prefix) {
157
+ logs.push({
158
+ severity: 'error',
159
+ message: 'Invalid ' + prefix,
160
+ startIndex: token.startIndex,
161
+ endIndex: token.endIndex,
162
+ });
163
+ }
164
+ else if (this.index > 0 && this.tokens[this.index - 1].type === ',') {
165
+ logs.push({
166
+ severity: 'warn',
167
+ message: 'Empty clause',
168
+ startIndex: token.startIndex,
169
+ endIndex: token.endIndex,
170
+ });
171
+ }
172
+ this.index++;
173
+ }
174
+ else if (token.type === 'prefix') {
175
+ prefix = token.value;
176
+ this.index++;
177
+ }
178
+ else if (this.handleRange(clauses)) {
179
+ if (prefix) {
180
+ logs.push({
181
+ severity: 'error',
182
+ message: 'Invalid ' + prefix,
183
+ startIndex: token.startIndex,
184
+ endIndex: token.endIndex,
185
+ });
186
+ this.index++;
187
+ }
188
+ }
189
+ else if (this.handleMerged(prefix, clauses)) {
190
+ prefix = undefined;
191
+ }
192
+ else if (token.type === 'null' || token.type === 'not_null') {
193
+ prefix = undefined;
194
+ clauses.push({ operator: token.type });
195
+ this.index++;
196
+ }
197
+ else {
198
+ logs.push({
199
+ severity: 'error',
200
+ message: 'Invalid token ' + token.value ||
201
+ (token.values ? token.values.join(' ') : ''),
202
+ startIndex: token.startIndex,
203
+ endIndex: token.endIndex,
204
+ });
205
+ prefix = undefined;
206
+ this.index++;
207
+ }
208
+ }
209
+ return { clauses, logs };
210
+ }
211
+ static createMomentClause(prefix, moment) {
212
+ if (!prefix) {
213
+ return { operator: 'on', moment }; // DateOnClause
214
+ }
215
+ else if (prefix === 'before') {
216
+ return { operator: 'before', moment }; // DateBeforeClause
217
+ }
218
+ else {
219
+ return { operator: 'after', moment }; // DateAfterClause
220
+ }
221
+ }
222
+ // (BEFORE|AFTER) LAST|DAYOFWEEK
223
+ static createIntervalMoment(prefix, tokens) {
224
+ const kind = tokens[0]
225
+ .type;
226
+ const unit = tokens[1].value;
227
+ const moment = { type: 'interval', kind, unit };
228
+ return DateParser.createMomentClause(prefix, moment);
229
+ }
230
+ // NUMBER|UNITOFTIME|AGO
231
+ // NUMBER|UNITOFTIME|FROM|NOW
232
+ static createOffsetMoment(prefix, tokens) {
233
+ const amount = Number(tokens[0].value);
234
+ const unit = tokens[1].value;
235
+ const direction = tokens[2].type === 'ago' ? 'ago' : 'from_now';
236
+ if (!DateParser.isValidNumber(amount)) {
237
+ return undefined;
238
+ }
239
+ const moment = {
240
+ type: 'offset_from_now',
241
+ direction,
242
+ amount,
243
+ unit,
244
+ };
245
+ return DateParser.createMomentClause(prefix, moment);
246
+ }
247
+ // (LAST|NEXT)|NUMBER|UNITOFTIME
248
+ static createSpanMoment(prefix, tokens) {
249
+ const amount = Number(tokens[0].value);
250
+ const unit = tokens[1].value;
251
+ const direction = tokens[2].type === 'last' ? 'last' : 'next';
252
+ if (!DateParser.isValidNumber(amount)) {
253
+ return undefined;
254
+ }
255
+ const moment = { type: 'span_from_now', direction, amount, unit };
256
+ return DateParser.createMomentClause(prefix, moment);
257
+ }
258
+ // (NUMBER|YEAR)|UNITOFTIME
259
+ static createDateDuration(prefix, tokens) {
260
+ if (prefix) {
261
+ return undefined; // before 7 hours is ambiguous, not allowed.
262
+ }
263
+ const operator = 'duration';
264
+ const amount = Number(tokens[0].value);
265
+ const unit = tokens[1].value;
266
+ if (!DateParser.isValidNumber(amount)) {
267
+ return undefined;
268
+ }
269
+ const clause = { operator, duration: { amount, unit } };
270
+ return clause;
271
+ }
272
+ // (BEFORE|AFTER) DATE DATE|TIME
273
+ static createAbsoluteMoment(prefix, tokens) {
274
+ const dateStr = tokens[0].value;
275
+ const matcher = /^\d{4}-\d{2}-\d{2}[Tt ](.+)$/.exec(dateStr);
276
+ const timeStr = matcher ? matcher[1] : '';
277
+ let unit = 'year';
278
+ if (timeStr.length > 8) {
279
+ unit = 'instant';
280
+ }
281
+ else if (timeStr.length > 5) {
282
+ unit = 'second';
283
+ }
284
+ else if (timeStr.length > 2) {
285
+ unit = 'minute';
286
+ }
287
+ else if (timeStr.length === 2) {
288
+ unit = 'hour';
289
+ }
290
+ else if (dateStr.length > 7) {
291
+ unit = 'day';
292
+ }
293
+ else if (dateStr.length > 4) {
294
+ unit = /[qQ]/.test(dateStr) ? 'quarter' : 'month';
295
+ }
296
+ const moment = { type: 'absolute', date: dateStr, unit };
297
+ return DateParser.createMomentClause(prefix, moment);
298
+ }
299
+ // NOW YESTERDAY TODAY TOMORROW
300
+ static createNamedMoment(prefix, tokens) {
301
+ let momentName = 'now';
302
+ switch (tokens[0].type) {
303
+ case 'today':
304
+ momentName = 'today';
305
+ break;
306
+ case 'yesterday':
307
+ momentName = 'yesterday';
308
+ break;
309
+ case 'tomorrow':
310
+ momentName = 'tomorrow';
311
+ break;
312
+ }
313
+ const moment = { type: 'named', name: momentName };
314
+ return DateParser.createMomentClause(prefix, moment);
315
+ }
316
+ static isValidNumber(value) {
317
+ return Number.isNaN(value) === false;
318
+ }
319
+ static createDurationFromMerged(token) {
320
+ if (!token.values || token.values.length !== 2) {
321
+ return undefined;
322
+ }
323
+ if (token.type === 'MERGE:number|unitoftime' ||
324
+ token.type === 'MERGE:year|unitoftime') {
325
+ const value = Number(token.values[0].value);
326
+ if (!DateParser.isValidNumber(value)) {
327
+ return undefined;
328
+ }
329
+ const unit = token.values[1].value;
330
+ return { amount: value, unit: unit };
331
+ }
332
+ return undefined;
333
+ }
334
+ static createClauseFromMerged(prefix, token) {
335
+ const tokens = token.values || [];
336
+ switch (token.type) {
337
+ case 'MERGE:last|unitoftime':
338
+ case 'MERGE:last|dayofweek':
339
+ case 'MERGE:this|unitoftime':
340
+ case 'MERGE:next|unitoftime':
341
+ case 'MERGE:next|dayofweek':
342
+ return this.createIntervalMoment(prefix, tokens);
343
+ case 'MERGE:last|number|unitoftime':
344
+ case 'MERGE:last|year|unitoftime':
345
+ case 'MERGE:next|number|unitoftime':
346
+ case 'MERGE:next|year|unitoftime':
347
+ return this.createSpanMoment(prefix, tokens);
348
+ case 'MERGE:number|unitoftime|ago':
349
+ case 'MERGE:year|unitoftime|ago':
350
+ case 'MERGE:number|unitoftime|from|now':
351
+ case 'MERGE:year|unitoftime|from|now':
352
+ return this.createOffsetMoment(prefix, tokens);
353
+ case 'MERGE:number|unitoftime':
354
+ case 'MERGE:year|unitoftime':
355
+ return this.createDateDuration(prefix, tokens);
356
+ case 'MERGE:date':
357
+ case 'MERGE:year':
358
+ return this.createAbsoluteMoment(prefix, tokens);
359
+ case 'MERGE:now':
360
+ case 'MERGE:today':
361
+ case 'MERGE:yesterday':
362
+ case 'MERGE:tomorrow':
363
+ return this.createNamedMoment(prefix, tokens);
364
+ default:
365
+ return undefined;
366
+ }
367
+ }
368
+ isMatchingToken(position, value, exactMatch) {
369
+ if (position < 0 || position >= this.tokens.length) {
370
+ return false;
371
+ }
372
+ return exactMatch
373
+ ? this.tokens[position].type === value
374
+ : this.tokens[position].type.startsWith(value);
375
+ }
376
+ handleRange(clauses) {
377
+ if (this.isMatchingToken(this.index, 'MERGE', false) &&
378
+ (this.isMatchingToken(this.index + 1, 'to', true) ||
379
+ this.isMatchingToken(this.index + 1, 'for', true)) &&
380
+ this.isMatchingToken(this.index + 2, 'MERGE', false)) {
381
+ const startToken = this.tokens[this.index];
382
+ const operator = this.tokens[this.index + 1].type; // TO | FOR
383
+ const endToken = this.tokens[this.index + 2];
384
+ const startClause = DateParser.createClauseFromMerged(undefined, startToken);
385
+ this.index += 3;
386
+ if (startClause === undefined || !('moment' in startClause)) {
387
+ return false;
388
+ }
389
+ if (operator === 'to') {
390
+ const endClause = DateParser.createClauseFromMerged(undefined, endToken);
391
+ if (endClause === undefined || !('moment' in endClause)) {
392
+ return false;
393
+ }
394
+ const clause = {
395
+ operator: 'to_range',
396
+ from: startClause.moment,
397
+ to: endClause.moment,
398
+ };
399
+ clauses.push(clause);
400
+ }
401
+ else {
402
+ const endDuration = DateParser.createDurationFromMerged(endToken);
403
+ if (endDuration === undefined) {
404
+ return false;
405
+ }
406
+ const clause = {
407
+ operator: 'for_range',
408
+ from: startClause.moment,
409
+ duration: endDuration,
410
+ };
411
+ clauses.push(clause);
412
+ }
413
+ return true;
414
+ }
415
+ return false;
416
+ }
417
+ handleMerged(prefix, clauses) {
418
+ const token = this.getNext();
419
+ if (token.type.startsWith('MERGE')) {
420
+ const clause = DateParser.createClauseFromMerged(prefix, token);
421
+ this.index++;
422
+ if (clause === undefined) {
423
+ return false;
424
+ }
425
+ clauses.push(clause);
426
+ return true;
427
+ }
428
+ return false;
429
+ }
430
+ }
431
+ exports.DateParser = DateParser;
432
+ DateParser.yearRegex = /[%_]/;
433
+ DateParser.negatedStartRegex = /^-(.+)$/;
434
+ //# sourceMappingURL=date_parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date_parser.js","sourceRoot":"","sources":["../src/date_parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { DateClause } from './date_types';
2
+ export declare class DateSerializer {
3
+ private clauses;
4
+ constructor(clauses: DateClause[]);
5
+ serialize(): string;
6
+ private static dateMomentToString;
7
+ private static goDateBetweenClause;
8
+ private static goDateForClause;
9
+ private static clauseToString;
10
+ private static clausesToString;
11
+ }
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DateSerializer = void 0;
10
+ class DateSerializer {
11
+ constructor(clauses) {
12
+ this.clauses = clauses;
13
+ this.clauses = clauses;
14
+ }
15
+ serialize() {
16
+ const result = DateSerializer.clausesToString(this.clauses);
17
+ return result.trim().replace(/,$/, '');
18
+ }
19
+ static dateMomentToString(moment) {
20
+ if (moment.type === 'absolute') {
21
+ return moment.date;
22
+ }
23
+ else if (moment.type === 'interval') {
24
+ return moment.kind + ' ' + moment.unit;
25
+ }
26
+ else if (moment.type === 'named') {
27
+ return moment.name;
28
+ }
29
+ else if (moment.type === 'offset_from_now') {
30
+ const direction = moment.direction === 'from_now' ? 'from now' : 'ago';
31
+ return moment.amount + ' ' + moment.unit + ' ' + direction;
32
+ }
33
+ else if (moment.type === 'span_from_now') {
34
+ return moment.direction + ' ' + moment.amount + ' ' + moment.unit;
35
+ }
36
+ else {
37
+ throw new Error('moment type not recognized ' + JSON.stringify(moment));
38
+ }
39
+ }
40
+ static goDateBetweenClause(clause) {
41
+ return (DateSerializer.dateMomentToString(clause.from) +
42
+ ' to ' +
43
+ DateSerializer.dateMomentToString(clause.to));
44
+ }
45
+ static goDateForClause(clause) {
46
+ return (DateSerializer.dateMomentToString(clause.from) +
47
+ ' for ' +
48
+ clause.duration.amount +
49
+ ' ' +
50
+ clause.duration.unit);
51
+ }
52
+ static clauseToString(clause) {
53
+ if (!('operator' in clause)) {
54
+ throw new Error('Invalid date clause ' + JSON.stringify(clause));
55
+ }
56
+ if (clause.operator === 'to_range') {
57
+ return DateSerializer.goDateBetweenClause(clause);
58
+ }
59
+ else if (clause.operator === 'for_range') {
60
+ return DateSerializer.goDateForClause(clause);
61
+ }
62
+ else if (clause.operator === 'before') {
63
+ return 'before ' + DateSerializer.dateMomentToString(clause.moment);
64
+ }
65
+ else if (clause.operator === 'after') {
66
+ return 'after ' + DateSerializer.dateMomentToString(clause.moment);
67
+ }
68
+ else if (clause.operator === 'on') {
69
+ return DateSerializer.dateMomentToString(clause.moment);
70
+ }
71
+ else if (clause.operator === 'null') {
72
+ return 'null';
73
+ }
74
+ else if (clause.operator === 'not_null') {
75
+ return '-null';
76
+ }
77
+ else if (clause.operator === 'duration') {
78
+ return clause.duration.amount + ' ' + clause.duration.unit;
79
+ }
80
+ else {
81
+ throw new Error('Clause type not recognized ' + JSON.stringify(clause));
82
+ }
83
+ }
84
+ static clausesToString(clauses) {
85
+ let result = '';
86
+ for (const clause of clauses) {
87
+ result += DateSerializer.clauseToString(clause);
88
+ result += ', ';
89
+ }
90
+ return result;
91
+ }
92
+ }
93
+ exports.DateSerializer = DateSerializer;
94
+ //# sourceMappingURL=date_serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date_serializer.js","sourceRoot":"","sources":["../src/date_serializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { FilterLog } from './clause_types';
2
+ export type DateTimeUnit = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'hour' | 'minute' | 'second' | 'instant';
3
+ export type DateWeekday = 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday';
4
+ export interface Duration {
5
+ amount: number;
6
+ unit: DateTimeUnit;
7
+ }
8
+ export type DateMomentName = 'now' | 'today' | 'yesterday' | 'tomorrow';
9
+ export interface NamedMoment {
10
+ type: 'named';
11
+ name: DateMomentName;
12
+ }
13
+ export type DateMomentIntervalOperator = 'last' | 'this' | 'next';
14
+ export interface IntervalMoment {
15
+ type: 'interval';
16
+ kind: DateMomentIntervalOperator;
17
+ unit: DateTimeUnit | DateWeekday;
18
+ }
19
+ export type DateMomentOffsetFromNowDirection = 'ago' | 'from_now';
20
+ export interface OffsetMoment {
21
+ type: 'offset_from_now';
22
+ direction: DateMomentOffsetFromNowDirection;
23
+ unit: DateTimeUnit;
24
+ amount: number;
25
+ }
26
+ export type DateMomentSpanFromNowDirection = 'last' | 'next';
27
+ export interface SpanMoment {
28
+ type: 'span_from_now';
29
+ direction: DateMomentSpanFromNowDirection;
30
+ unit: DateTimeUnit;
31
+ amount: number;
32
+ }
33
+ export interface AbsoluteMoment {
34
+ type: 'absolute';
35
+ date: string;
36
+ unit: DateTimeUnit;
37
+ }
38
+ export type DateMoment = AbsoluteMoment | NamedMoment | IntervalMoment | SpanMoment | OffsetMoment;
39
+ export interface DateAfterClause {
40
+ operator: 'after';
41
+ moment: DateMoment;
42
+ }
43
+ export interface DateBeforeClause {
44
+ operator: 'before';
45
+ moment: DateMoment;
46
+ }
47
+ export interface DateOnClause {
48
+ operator: 'on';
49
+ moment: DateMoment;
50
+ }
51
+ export interface DateBetweenClause {
52
+ operator: 'to_range';
53
+ from: DateMoment;
54
+ to: DateMoment;
55
+ }
56
+ export interface DateForClause {
57
+ operator: 'for_range';
58
+ from: DateMoment;
59
+ duration: Duration;
60
+ }
61
+ export interface DateNullClause {
62
+ operator: 'null';
63
+ }
64
+ export interface DateNotNullClause {
65
+ operator: 'not_null';
66
+ }
67
+ export interface DateDurationClause {
68
+ operator: 'duration';
69
+ duration: Duration;
70
+ }
71
+ export type DateClause = DateAfterClause | DateBeforeClause | DateOnClause | DateBetweenClause | DateForClause | DateNullClause | DateNotNullClause | DateDurationClause;
72
+ export interface DateParserResponse {
73
+ clauses: DateClause[];
74
+ logs: FilterLog[];
75
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=date_types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date_types.js","sourceRoot":"","sources":["../src/date_types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1 @@
1
+ export {};