@malloydata/malloy-filter 0.0.237-dev250222012247 → 0.0.237-dev250222034547

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 (65) hide show
  1. package/dist/a_simple_parser.js +12 -9
  2. package/dist/a_simple_parser.js.map +1 -1
  3. package/dist/base_parser.d.ts +0 -2
  4. package/dist/base_parser.js.map +1 -1
  5. package/dist/boolean_parser.d.ts +2 -2
  6. package/dist/boolean_parser.js.map +1 -1
  7. package/dist/boolean_serializer.d.ts +4 -4
  8. package/dist/boolean_serializer.js +3 -3
  9. package/dist/boolean_serializer.js.map +1 -1
  10. package/dist/clause_types.d.ts +15 -41
  11. package/dist/date_parser.d.ts +13 -11
  12. package/dist/date_parser.js +187 -130
  13. package/dist/date_parser.js.map +1 -1
  14. package/dist/date_serializer.d.ts +6 -5
  15. package/dist/date_serializer.js +53 -71
  16. package/dist/date_serializer.js.map +1 -1
  17. package/dist/date_types.d.ts +69 -0
  18. package/dist/{filter_types.js → date_types.js} +1 -1
  19. package/dist/date_types.js.map +1 -0
  20. package/dist/generate_samples.js +154 -85
  21. package/dist/generate_samples.js.map +1 -1
  22. package/dist/number_parser.d.ts +2 -2
  23. package/dist/number_parser.js.map +1 -1
  24. package/dist/number_serializer.d.ts +4 -4
  25. package/dist/number_serializer.js +3 -3
  26. package/dist/number_serializer.js.map +1 -1
  27. package/dist/string_parser.d.ts +2 -2
  28. package/dist/string_parser.js.map +1 -1
  29. package/dist/string_serializer.d.ts +5 -5
  30. package/dist/string_serializer.js +5 -5
  31. package/dist/string_serializer.js.map +1 -1
  32. package/package.json +1 -2
  33. package/src/a_simple_parser.ts +12 -9
  34. package/src/base_parser.ts +0 -3
  35. package/src/boolean_parser.ts +7 -3
  36. package/src/boolean_serializer.ts +5 -6
  37. package/src/clause_types.ts +15 -97
  38. package/src/date_parser.ts +224 -191
  39. package/src/date_serializer.ts +55 -87
  40. package/src/date_types.ts +149 -0
  41. package/src/generate_samples.ts +170 -107
  42. package/src/number_parser.ts +5 -5
  43. package/src/number_serializer.ts +5 -6
  44. package/src/string_parser.ts +14 -9
  45. package/src/string_serializer.ts +8 -9
  46. package/tsconfig.json +1 -6
  47. package/dist/a_simple_serializer.d.ts +0 -1
  48. package/dist/a_simple_serializer.js +0 -31
  49. package/dist/a_simple_serializer.js.map +0 -1
  50. package/dist/base_serializer.d.ts +0 -6
  51. package/dist/base_serializer.js +0 -11
  52. package/dist/base_serializer.js.map +0 -1
  53. package/dist/filter_parser.d.ts +0 -12
  54. package/dist/filter_parser.js +0 -66
  55. package/dist/filter_parser.js.map +0 -1
  56. package/dist/filter_serializer.d.ts +0 -13
  57. package/dist/filter_serializer.js +0 -43
  58. package/dist/filter_serializer.js.map +0 -1
  59. package/dist/filter_types.d.ts +0 -10
  60. package/dist/filter_types.js.map +0 -1
  61. package/src/a_simple_serializer.ts +0 -40
  62. package/src/base_serializer.ts +0 -9
  63. package/src/filter_parser.ts +0 -68
  64. package/src/filter_serializer.ts +0 -49
  65. package/src/filter_types.ts +0 -12
@@ -1,20 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const filter_parser_1 = require("./filter_parser");
3
+ const boolean_parser_1 = require("./boolean_parser");
4
+ const string_parser_1 = require("./string_parser");
5
+ const number_parser_1 = require("./number_parser");
6
+ const date_parser_1 = require("./date_parser");
4
7
  /* eslint-disable no-console */
5
8
  function aSimpleParser() {
6
9
  let str = 'CAT,DOG';
7
- let response = new filter_parser_1.FilterParser(str, 'string').parse();
8
- console.log(str, '\n', ...response.clauses, '\n');
10
+ const stringResponse = new string_parser_1.StringParser(str).parse();
11
+ console.log(str, '\n', ...stringResponse.clauses, '\n');
9
12
  str = '-5.5, 10, 2.3e7';
10
- response = new filter_parser_1.FilterParser(str, 'number').parse();
11
- console.log(str, '\n', ...response.clauses, '\n');
13
+ const numberResponse = new number_parser_1.NumberParser(str).parse();
14
+ console.log(str, '\n', ...numberResponse.clauses, '\n');
12
15
  str = 'null, false';
13
- response = new filter_parser_1.FilterParser(str, 'boolean').parse();
14
- console.log(str, '\n', ...response.clauses, '\n');
16
+ const booleanResponse = new boolean_parser_1.BooleanParser(str).parse();
17
+ console.log(str, '\n', ...booleanResponse.clauses, '\n');
15
18
  str = 'after 2025-10-05';
16
- response = new filter_parser_1.FilterParser(str, 'date').parse();
17
- console.log(str, '\n', ...response.clauses, '\n');
19
+ const dateResponse = new date_parser_1.DateParser(str).parse();
20
+ console.log(str, '\n', ...dateResponse.clauses, '\n');
18
21
  }
19
22
  aSimpleParser();
20
23
  //# sourceMappingURL=a_simple_parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"a_simple_parser.js","sourceRoot":"","sources":["../src/a_simple_parser.ts"],"names":[],"mappings":";;AAAA,mDAA6C;AAE7C,+BAA+B;AAC/B,SAAS,aAAa;IACpB,IAAI,GAAG,GAAG,SAAS,CAAC;IACpB,IAAI,QAAQ,GAAG,IAAI,4BAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAElD,GAAG,GAAG,iBAAiB,CAAC;IACxB,QAAQ,GAAG,IAAI,4BAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAElD,GAAG,GAAG,aAAa,CAAC;IACpB,QAAQ,GAAG,IAAI,4BAAY,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAElD,GAAG,GAAG,kBAAkB,CAAC;IACzB,QAAQ,GAAG,IAAI,4BAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"a_simple_parser.js","sourceRoot":"","sources":["../src/a_simple_parser.ts"],"names":[],"mappings":";;AAAA,qDAA+C;AAC/C,mDAA6C;AAC7C,mDAA6C;AAC7C,+CAAyC;AAEzC,+BAA+B;AAC/B,SAAS,aAAa;IACpB,IAAI,GAAG,GAAG,SAAS,CAAC;IACpB,MAAM,cAAc,GAAG,IAAI,4BAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAExD,GAAG,GAAG,iBAAiB,CAAC;IACxB,MAAM,cAAc,GAAG,IAAI,4BAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAExD,GAAG,GAAG,aAAa,CAAC;IACpB,MAAM,eAAe,GAAG,IAAI,8BAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAEzD,GAAG,GAAG,kBAAkB,CAAC;IACzB,MAAM,YAAY,GAAG,IAAI,wBAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,aAAa,EAAE,CAAC"}
@@ -1,12 +1,10 @@
1
1
  import { Token } from './token_types';
2
- import { FilterParserResponse } from './filter_types';
3
2
  export declare abstract class BaseParser {
4
3
  protected inputString: string;
5
4
  protected index: number;
6
5
  protected tokens: Token[];
7
6
  constructor(inputString: string);
8
7
  getTokens(): Token[];
9
- abstract parse(): FilterParserResponse;
10
8
  protected getAt(index: number): Token;
11
9
  protected getNext(): Token;
12
10
  protected static matchTokenTypes(candidates: string[], index: number, tokens: Token[]): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"base_parser.js","sourceRoot":"","sources":["../src/base_parser.ts"],"names":[],"mappings":";;;AAGA,MAAsB,UAAU;IAK9B,YAAY,WAAmB;QAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAIS,KAAK,CAAC,KAAa;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAES,OAAO;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAES,MAAM,CAAC,eAAe,CAC9B,UAAoB,EACpB,KAAa,EACb,MAAe;QAEf,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;QAC3C,IAAI,KAAK,GAAG,CAAC,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE;YACzC,OAAO,KAAK,CAAC;SACd;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE;gBAC5C,OAAO,KAAK,CAAC;aACd;SACF;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAzCD,gCAyCC"}
1
+ {"version":3,"file":"base_parser.js","sourceRoot":"","sources":["../src/base_parser.ts"],"names":[],"mappings":";;;AAEA,MAAsB,UAAU;IAK9B,YAAY,WAAmB;QAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAES,KAAK,CAAC,KAAa;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAES,OAAO;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAES,MAAM,CAAC,eAAe,CAC9B,UAAoB,EACpB,KAAa,EACb,MAAe;QAEf,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;QAC3C,IAAI,KAAK,GAAG,CAAC,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE;YACzC,OAAO,KAAK,CAAC;SACd;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE;gBAC5C,OAAO,KAAK,CAAC;aACd;SACF;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAvCD,gCAuCC"}
@@ -1,7 +1,7 @@
1
+ import { BooleanParserResponse } from './clause_types';
1
2
  import { BaseParser } from './base_parser';
2
- import { FilterParserResponse } from './filter_types';
3
3
  export declare class BooleanParser extends BaseParser {
4
4
  constructor(input: string);
5
5
  private tokenize;
6
- parse(): FilterParserResponse;
6
+ parse(): BooleanParserResponse;
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"boolean_parser.js","sourceRoot":"","sources":["../src/boolean_parser.ts"],"names":[],"mappings":";;;AAAA,2CAAqE;AAErE,+CAAyC;AAGzC,MAAa,aAAc,SAAQ,wBAAU;IAC3C,YAAY,KAAa;QACvB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEO,QAAQ;QACd,MAAM,iBAAiB,GAAmB,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QACpE,MAAM,YAAY,GAAmB;YACnC,EAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAC;YAC/C,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;YACnD,EAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAC;YAC/C,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;SAClD,CAAC;QACF,MAAM,MAAM,GAAoB;YAC9B,kBAAkB,EAAE,IAAI;YACxB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB;YACjB,YAAY,EAAE,YAAY;SAC3B,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,qBAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE;gBACtB,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM,IACL,KAAK,CAAC,IAAI,KAAK,MAAM;gBACrB,KAAK,CAAC,IAAI,KAAK,MAAM;gBACrB,KAAK,CAAC,IAAI,KAAK,OAAO;gBACtB,KAAK,CAAC,IAAI,KAAK,SAAS,EACxB;gBACA,MAAM,MAAM,GAAkB,EAAC,QAAQ,EAAE,KAAK,CAAC,IAAuB,EAAC,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,gBAAgB,GAAG,KAAK,CAAC,KAAK;oBACvC,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;SACF;QACD,OAAO,EAAC,OAAO,EAAE,MAAM,EAAC,CAAC;IAC3B,CAAC;CACF;AAtDD,sCAsDC"}
1
+ {"version":3,"file":"boolean_parser.js","sourceRoot":"","sources":["../src/boolean_parser.ts"],"names":[],"mappings":";;;AAAA,2CAAqE;AAOrE,+CAAyC;AAEzC,MAAa,aAAc,SAAQ,wBAAU;IAC3C,YAAY,KAAa;QACvB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEO,QAAQ;QACd,MAAM,iBAAiB,GAAmB,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QACpE,MAAM,YAAY,GAAmB;YACnC,EAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAC;YAC/C,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;YACnD,EAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAC;YAC/C,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;SAClD,CAAC;QACF,MAAM,MAAM,GAAoB;YAC9B,kBAAkB,EAAE,IAAI;YACxB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB;YACjB,YAAY,EAAE,YAAY;SAC3B,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,qBAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE;gBACtB,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM,IACL,KAAK,CAAC,IAAI,KAAK,MAAM;gBACrB,KAAK,CAAC,IAAI,KAAK,MAAM;gBACrB,KAAK,CAAC,IAAI,KAAK,OAAO;gBACtB,KAAK,CAAC,IAAI,KAAK,SAAS,EACxB;gBACA,MAAM,MAAM,GAAkB,EAAC,QAAQ,EAAE,KAAK,CAAC,IAAuB,EAAC,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,gBAAgB,GAAG,KAAK,CAAC,KAAK;oBACvC,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;SACF;QACD,OAAO,EAAC,OAAO,EAAE,MAAM,EAAC,CAAC;IAC3B,CAAC;CACF;AAtDD,sCAsDC"}
@@ -1,7 +1,7 @@
1
- import { Clause } from './clause_types';
2
- import { BaseSerializer } from './base_serializer';
3
- export declare class BooleanSerializer extends BaseSerializer {
4
- constructor(clauses: Clause[]);
1
+ import { BooleanClause } from './clause_types';
2
+ export declare class BooleanSerializer {
3
+ private clauses;
4
+ constructor(clauses: BooleanClause[]);
5
5
  serialize(): string;
6
6
  private static booleanClauseToString;
7
7
  private static clauseToString;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BooleanSerializer = void 0;
4
- const base_serializer_1 = require("./base_serializer");
5
- class BooleanSerializer extends base_serializer_1.BaseSerializer {
4
+ class BooleanSerializer {
6
5
  constructor(clauses) {
7
- super(clauses);
6
+ this.clauses = clauses;
7
+ this.clauses = clauses;
8
8
  }
9
9
  serialize() {
10
10
  const result = BooleanSerializer.clauseToString(this.clauses);
@@ -1 +1 @@
1
- {"version":3,"file":"boolean_serializer.js","sourceRoot":"","sources":["../src/boolean_serializer.ts"],"names":[],"mappings":";;;AACA,uDAAiD;AAEjD,MAAa,iBAAkB,SAAQ,gCAAc;IACnD,YAAY,OAAiB;QAC3B,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAEM,SAAS;QACd,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,MAAqB;QACxD,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;IACnE,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,OAAiB;QAC7C,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,IAAI,UAAU,IAAI,MAAM,EAAE;gBACxB,MAAM,IAAI,iBAAiB,CAAC,qBAAqB,CAC/C,MAAuB,CACxB,CAAC;aACH;iBAAM;gBACL,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;aACrE;YACD,MAAM,IAAI,IAAI,CAAC;SAChB;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA5BD,8CA4BC"}
1
+ {"version":3,"file":"boolean_serializer.js","sourceRoot":"","sources":["../src/boolean_serializer.ts"],"names":[],"mappings":";;;AAEA,MAAa,iBAAiB;IAC5B,YAAoB,OAAwB;QAAxB,YAAO,GAAP,OAAO,CAAiB;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEM,SAAS;QACd,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,MAAqB;QACxD,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;IACnE,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,OAAwB;QACpD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,IAAI,UAAU,IAAI,MAAM,EAAE;gBACxB,MAAM,IAAI,iBAAiB,CAAC,qBAAqB,CAC/C,MAAuB,CACxB,CAAC;aACH;iBAAM;gBACL,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;aACrE;YACD,MAAM,IAAI,IAAI,CAAC;SAChB;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA5BD,8CA4BC"}
@@ -15,7 +15,7 @@ export interface NumberRange {
15
15
  export type QuoteType = 'SINGLE' | 'DOUBLE' | 'BACKTICK' | 'TRIPLESINGLE' | 'TRIPLEDOUBLE' | 'ESCAPEDSINGLE' | 'ESCAPEDDOUBLE' | 'ESCAPEDBACKTICK';
16
16
  export type StringOperator = 'EMPTY' | 'NOTEMPTY' | 'starts' | 'ends' | 'contains' | 'notStarts' | 'notEnds' | 'notContains' | '~' | '=' | '!~' | '!=';
17
17
  export type StringValue = string | null;
18
- export interface StringCondition {
18
+ export interface StringClause {
19
19
  operator: StringOperator;
20
20
  values: StringValue[];
21
21
  quotes?: QuoteType[];
@@ -24,47 +24,21 @@ export type BooleanOperator = 'TRUE' | 'FALSE' | 'NULL' | 'NOTNULL';
24
24
  export interface BooleanClause {
25
25
  operator: BooleanOperator;
26
26
  }
27
- export type DatePrefix = 'BEFORE' | 'AFTER';
28
- export type DateTimeUnit = 'YEAR' | 'QUARTER' | 'MONTH' | 'WEEK' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND';
29
- export type DateWeekday = 'MONDAY' | 'TUESDAY' | 'WEDNESDAY' | 'THURSDAY' | 'FRIDAY' | 'SATURDAY' | 'SUNDAY';
30
- export type DateMomentNowOperator = 'NOW' | 'TODAY' | 'YESTERDAY' | 'TOMORROW';
31
- export interface DateMomentNow {
32
- prefix?: DatePrefix;
33
- operator: DateMomentNowOperator;
34
- }
35
- export type DateMomentIntervalOperator = 'LAST' | 'THIS' | 'NEXT';
36
- export interface DateMomentInterval {
37
- prefix?: DatePrefix;
38
- operator: DateMomentIntervalOperator;
39
- unit: DateTimeUnit | DateWeekday;
40
- }
41
- export type DateMomentNumberIntervalOperator = 'LASTN' | 'NEXTN' | 'AGO' | 'FROMNOW';
42
- export interface DateMomentNumberInterval {
43
- prefix?: DatePrefix;
44
- operator: DateMomentNumberIntervalOperator;
45
- unit: DateTimeUnit;
46
- value: string;
27
+ export type NumberClause = NumberCondition | NumberRange;
28
+ export interface FilterError {
29
+ message: string;
30
+ startIndex: number;
31
+ endIndex: number;
47
32
  }
48
- export type DateMomentNumberUnitOperator = 'TIMEBLOCK';
49
- export interface DateMomentNumberUnit {
50
- prefix?: DatePrefix;
51
- operator: DateMomentNumberUnitOperator;
52
- unit: DateTimeUnit;
53
- value: string;
33
+ export interface BooleanParserResponse {
34
+ clauses: BooleanClause[];
35
+ errors: FilterError[];
54
36
  }
55
- export type DateMomentNumberOperator = 'DATE' | 'DATETIME';
56
- export interface DateMomentNumber {
57
- prefix?: DatePrefix;
58
- operator: DateMomentNumberOperator;
59
- date: string;
60
- time?: string;
37
+ export interface NumberParserResponse {
38
+ clauses: NumberClause[];
39
+ errors: FilterError[];
61
40
  }
62
- export type DateMoment = DateMomentNow | DateMomentInterval | DateMomentNumberInterval | DateMomentNumberUnit | DateMomentNumber;
63
- export interface DateRange {
64
- start: DateMoment;
65
- operator: 'TO' | 'FOR';
66
- end: DateMoment;
41
+ export interface StringParserResponse {
42
+ clauses: StringClause[];
43
+ errors: FilterError[];
67
44
  }
68
- export type NumberClause = NumberCondition | NumberRange;
69
- export type DateClause = DateMoment | DateRange;
70
- export type Clause = NumberClause | StringCondition | BooleanClause | DateClause;
@@ -1,5 +1,5 @@
1
+ import { DateParserResponse } from './date_types';
1
2
  import { BaseParser } from './base_parser';
2
- import { FilterParserResponse } from './filter_types';
3
3
  export declare class DateParser extends BaseParser {
4
4
  private static readonly yearRegex;
5
5
  private static readonly negatedStartRegex;
@@ -7,16 +7,18 @@ export declare class DateParser extends BaseParser {
7
7
  private tokenize;
8
8
  private mergeMomentTokens;
9
9
  private matchAndMerge;
10
- parse(): FilterParserResponse;
11
- private static createMomentInterval;
12
- private static createMomentNumberInterval;
13
- private static createMomentNumberIntervalAgo;
14
- private static createMomentNumberIntervalFromNow;
15
- private static createMomentNumberUnit;
16
- private static createMomentNumber;
17
- private static createMomentNow;
18
- private static createMomentFromToken;
10
+ parse(): DateParserResponse;
11
+ private static createMomentClause;
12
+ private static createIntervalMoment;
13
+ private static createOffsetMoment;
14
+ private static createSpanMoment;
15
+ private static createDateDuration;
16
+ private static createAbsoluteMoment;
17
+ private static createNamedMoment;
18
+ private static isValidNumber;
19
+ private static createDurationFromMerged;
20
+ private static createClauseFromMerged;
19
21
  private isMatchingToken;
20
22
  private handleRange;
21
- private handleMoment;
23
+ private handleMerged;
22
24
  }
@@ -39,7 +39,7 @@ class DateParser extends base_parser_1.BaseParser {
39
39
  { type: 'FROM', value: 'from', ignoreCase: true },
40
40
  { type: 'FOR', value: 'for', ignoreCase: true },
41
41
  { type: 'TO', value: 'to', ignoreCase: true },
42
- { type: 'YEARORNUMBER', value: /^\d\d\d\d$/ },
42
+ { type: 'YEAR', value: /^\d\d\d\d$/ },
43
43
  { type: 'NUMBER', value: /^[\d.]+/, ignoreCase: true },
44
44
  ];
45
45
  const params = {
@@ -57,28 +57,28 @@ class DateParser extends base_parser_1.BaseParser {
57
57
  const output = [];
58
58
  this.index = 0;
59
59
  while (this.index < this.tokens.length) {
60
- if (this.matchAndMerge('LAST|UNITOFTIME', this.tokens, output) ||
61
- this.matchAndMerge('LAST|DAYOFWEEK', this.tokens, output) ||
62
- this.matchAndMerge('LAST|NUMBER|UNITOFTIME', this.tokens, output) ||
63
- this.matchAndMerge('LAST|YEARORNUMBER|UNITOFTIME', this.tokens, output) ||
64
- this.matchAndMerge('THIS|UNITOFTIME', this.tokens, output) ||
65
- this.matchAndMerge('NEXT|UNITOFTIME', this.tokens, output) ||
66
- this.matchAndMerge('NEXT|DAYOFWEEK', this.tokens, output) ||
67
- this.matchAndMerge('NEXT|NUMBER|UNITOFTIME', this.tokens, output) ||
68
- this.matchAndMerge('NEXT|YEARORNUMBER|UNITOFTIME', this.tokens, output) ||
69
- this.matchAndMerge('NUMBER|UNITOFTIME|AGO', this.tokens, output) ||
70
- this.matchAndMerge('YEARORNUMBER|UNITOFTIME|AGO', this.tokens, output) ||
71
- this.matchAndMerge('NUMBER|UNITOFTIME|FROM|NOW', this.tokens, output) ||
72
- this.matchAndMerge('YEARORNUMBER|UNITOFTIME|FROM|NOW', this.tokens, output) ||
73
- this.matchAndMerge('NUMBER|UNITOFTIME', this.tokens, output) ||
74
- this.matchAndMerge('YEARORNUMBER|UNITOFTIME', this.tokens, output) ||
75
- this.matchAndMerge('DATE|TIME', this.tokens, output) ||
76
- this.matchAndMerge('TODAY', this.tokens, output) ||
77
- this.matchAndMerge('YESTERDAY', this.tokens, output) ||
78
- this.matchAndMerge('TOMORROW', this.tokens, output) ||
79
- this.matchAndMerge('DATE', this.tokens, output) ||
80
- this.matchAndMerge('YEARORNUMBER', this.tokens, output) ||
81
- this.matchAndMerge('NOW', this.tokens, output)) {
60
+ if (this.matchAndMerge('LAST|UNITOFTIME', output) ||
61
+ this.matchAndMerge('LAST|DAYOFWEEK', output) ||
62
+ this.matchAndMerge('LAST|NUMBER|UNITOFTIME', output) ||
63
+ this.matchAndMerge('LAST|YEAR|UNITOFTIME', output) ||
64
+ this.matchAndMerge('THIS|UNITOFTIME', output) ||
65
+ this.matchAndMerge('NEXT|UNITOFTIME', output) ||
66
+ this.matchAndMerge('NEXT|DAYOFWEEK', output) ||
67
+ this.matchAndMerge('NEXT|NUMBER|UNITOFTIME', output) ||
68
+ this.matchAndMerge('NEXT|YEAR|UNITOFTIME', output) ||
69
+ this.matchAndMerge('NUMBER|UNITOFTIME|AGO', output) ||
70
+ this.matchAndMerge('YEAR|UNITOFTIME|AGO', output) ||
71
+ this.matchAndMerge('NUMBER|UNITOFTIME|FROM|NOW', output) ||
72
+ this.matchAndMerge('YEAR|UNITOFTIME|FROM|NOW', output) ||
73
+ this.matchAndMerge('NUMBER|UNITOFTIME', output) ||
74
+ this.matchAndMerge('YEAR|UNITOFTIME', output) ||
75
+ this.matchAndMerge('DATE|TIME', output) ||
76
+ this.matchAndMerge('TODAY', output) ||
77
+ this.matchAndMerge('YESTERDAY', output) ||
78
+ this.matchAndMerge('TOMORROW', output) ||
79
+ this.matchAndMerge('DATE', output) ||
80
+ this.matchAndMerge('YEAR', output) ||
81
+ this.matchAndMerge('NOW', output)) {
82
82
  continue;
83
83
  }
84
84
  else {
@@ -88,12 +88,12 @@ class DateParser extends base_parser_1.BaseParser {
88
88
  }
89
89
  return output;
90
90
  }
91
- matchAndMerge(types, tokens, output) {
91
+ matchAndMerge(types, output) {
92
92
  const idx = this.index;
93
- const matchedTokens = tokenizer_1.Tokenizer.matchTypes(types, tokens, idx);
93
+ const matchedTokens = tokenizer_1.Tokenizer.matchTypes(types, this.tokens, idx);
94
94
  if (matchedTokens) {
95
95
  output.push({
96
- type: 'MOMENT:' + types,
96
+ type: 'MERGE:' + types,
97
97
  value: '',
98
98
  values: matchedTokens,
99
99
  startIndex: matchedTokens[0].startIndex,
@@ -136,7 +136,7 @@ class DateParser extends base_parser_1.BaseParser {
136
136
  this.index++;
137
137
  }
138
138
  }
139
- else if (this.handleMoment(prefix, clauses)) {
139
+ else if (this.handleMerged(prefix, clauses)) {
140
140
  prefix = undefined;
141
141
  }
142
142
  else {
@@ -151,116 +151,154 @@ class DateParser extends base_parser_1.BaseParser {
151
151
  }
152
152
  return { clauses, errors };
153
153
  }
154
- // LAST|DAYOFWEEK
155
- static createMomentInterval(prefix, tokens) {
156
- const operator = tokens[0]
157
- .type;
158
- const unit = tokens[1].value;
159
- const moment = { operator, unit };
160
- if (prefix) {
161
- moment.prefix = prefix;
154
+ static createMomentClause(prefix, moment) {
155
+ if (!prefix) {
156
+ return { operator: 'ON', moment }; // DateOnClause
162
157
  }
163
- return moment;
164
- }
165
- // LAST|NUMBER|UNITOFTIME
166
- static createMomentNumberInterval(prefix, tokens) {
167
- const type0 = tokens[0].type;
168
- const operator = type0 === 'LAST' ? 'LASTN' : 'NEXTN';
169
- const value = tokens[1].value;
170
- const unit = tokens[2].value;
171
- const moment = { operator, value, unit };
172
- if (prefix) {
173
- moment.prefix = prefix;
158
+ else if (prefix === 'BEFORE') {
159
+ return { operator: 'BEFORE', moment }; // DateBeforeClause
160
+ }
161
+ else {
162
+ return { operator: 'AFTER', moment }; // DateAfterClause
174
163
  }
175
- return moment;
176
164
  }
177
- // NUMBER|UNITOFTIME|AGO
178
- static createMomentNumberIntervalAgo(prefix, tokens) {
179
- const operator = 'AGO';
180
- const value = tokens[0].value;
165
+ // (BEFORE|AFTER) LAST|DAYOFWEEK
166
+ static createIntervalMoment(prefix, tokens) {
167
+ const kind = tokens[0]
168
+ .type;
181
169
  const unit = tokens[1].value;
182
- const moment = { operator, value, unit };
183
- if (prefix) {
184
- moment.prefix = prefix;
185
- }
186
- return moment;
170
+ const moment = { type: 'INTERVAL', kind, unit };
171
+ return DateParser.createMomentClause(prefix, moment);
187
172
  }
173
+ // NUMBER|UNITOFTIME|AGO
188
174
  // NUMBER|UNITOFTIME|FROM|NOW
189
- static createMomentNumberIntervalFromNow(prefix, tokens) {
190
- const operator = 'FROMNOW';
191
- const value = tokens[0].value;
175
+ static createOffsetMoment(prefix, tokens) {
176
+ const amount = Number(tokens[0].value);
192
177
  const unit = tokens[1].value;
193
- const moment = { operator, value, unit };
194
- if (prefix) {
195
- moment.prefix = prefix;
178
+ const direction = tokens[2].type === 'AGO' ? 'AGO' : 'FROMNOW';
179
+ if (!DateParser.isValidNumber(amount)) {
180
+ return undefined;
196
181
  }
197
- return moment;
182
+ const moment = {
183
+ type: 'OFFSET_FROM_NOW',
184
+ direction,
185
+ amount,
186
+ unit,
187
+ };
188
+ return DateParser.createMomentClause(prefix, moment);
198
189
  }
199
- // NUMBER|UNITOFTIME
200
- static createMomentNumberUnit(prefix, tokens) {
201
- const operator = 'TIMEBLOCK';
202
- const value = tokens[0].value;
190
+ // (LAST|NEXT)|NUMBER|UNITOFTIME
191
+ static createSpanMoment(prefix, tokens) {
192
+ const amount = Number(tokens[0].value);
203
193
  const unit = tokens[1].value;
204
- const moment = { operator, value, unit };
194
+ const direction = tokens[2].type === 'LAST' ? 'LAST' : 'NEXT';
195
+ if (!DateParser.isValidNumber(amount)) {
196
+ return undefined;
197
+ }
198
+ const moment = { type: 'SPAN_FROM_NOW', direction, amount, unit };
199
+ return DateParser.createMomentClause(prefix, moment);
200
+ }
201
+ // (NUMBER|YEAR)|UNITOFTIME
202
+ static createDateDuration(prefix, tokens) {
205
203
  if (prefix) {
206
- moment.prefix = prefix;
204
+ return undefined; // before 7 hours is ambiguous, not allowed.
205
+ }
206
+ const operator = 'DURATION';
207
+ const amount = Number(tokens[0].value);
208
+ const unit = tokens[1].value;
209
+ if (!DateParser.isValidNumber(amount)) {
210
+ return undefined;
207
211
  }
208
- return moment;
212
+ const clause = { operator, duration: { amount, unit } };
213
+ return clause;
209
214
  }
210
- // DATE DATE|TIME
211
- static createMomentNumber(prefix, tokens) {
212
- const operator = tokens.length === 2 ? 'DATETIME' : 'DATE';
213
- const moment = { operator, date: tokens[0].value };
215
+ // (BEFORE|AFTER) DATE DATE|TIME
216
+ static createAbsoluteMoment(prefix, tokens) {
217
+ let unit = 'YEAR';
218
+ let date = tokens[0].value;
214
219
  if (tokens.length === 2) {
215
- moment.time = tokens[1].value;
220
+ const timeStr = tokens[1].value;
221
+ date += ' ' + timeStr;
222
+ if (timeStr.length > 5)
223
+ unit = 'SECOND';
224
+ else
225
+ unit = 'MINUTE';
216
226
  }
217
- if (prefix) {
218
- moment.prefix = prefix;
227
+ else if (date.length > 7) {
228
+ unit = 'DAY';
219
229
  }
220
- return moment;
230
+ else if (date.length > 4) {
231
+ unit = 'MONTH';
232
+ }
233
+ const moment = { type: 'ABSOLUTE', date, unit };
234
+ return DateParser.createMomentClause(prefix, moment);
221
235
  }
222
236
  // NOW YESTERDAY TODAY TOMORROW
223
- static createMomentNow(prefix, tokens) {
224
- const operator = tokens[0]
225
- .type;
226
- const moment = { operator };
227
- if (prefix) {
228
- moment.prefix = prefix;
237
+ static createNamedMoment(prefix, tokens) {
238
+ let momentName = 'NOW';
239
+ switch (tokens[0].type) {
240
+ case 'TODAY':
241
+ momentName = 'TODAY';
242
+ break;
243
+ case 'YESTERDAY':
244
+ momentName = 'YESTERDAY';
245
+ break;
246
+ case 'TOMORROW':
247
+ momentName = 'TOMORROW';
248
+ break;
249
+ }
250
+ const moment = { type: 'NAMED', name: momentName };
251
+ return DateParser.createMomentClause(prefix, moment);
252
+ }
253
+ static isValidNumber(value) {
254
+ return Number.isNaN(value) === false;
255
+ }
256
+ static createDurationFromMerged(token) {
257
+ if (!token.values || token.values.length !== 2) {
258
+ return undefined;
229
259
  }
230
- return moment;
260
+ if (token.type === 'MERGE:NUMBER|UNITOFTIME' ||
261
+ token.type === 'MERGE:YEAR|UNITOFTIME') {
262
+ const value = Number(token.values[0].value);
263
+ if (!DateParser.isValidNumber(value)) {
264
+ return undefined;
265
+ }
266
+ const unit = token.values[1].value;
267
+ return { amount: value, unit: unit };
268
+ }
269
+ return undefined;
231
270
  }
232
- static createMomentFromToken(prefix, token) {
271
+ static createClauseFromMerged(prefix, token) {
233
272
  const tokens = token.values || [];
234
273
  switch (token.type) {
235
- case 'MOMENT:LAST|UNITOFTIME':
236
- case 'MOMENT:LAST|DAYOFWEEK':
237
- case 'MOMENT:THIS|UNITOFTIME':
238
- case 'MOMENT:NEXT|UNITOFTIME':
239
- case 'MOMENT:NEXT|DAYOFWEEK':
240
- return this.createMomentInterval(prefix, tokens);
241
- case 'MOMENT:LAST|NUMBER|UNITOFTIME':
242
- case 'MOMENT:LAST|YEARORNUMBER|UNITOFTIME':
243
- case 'MOMENT:NEXT|NUMBER|UNITOFTIME':
244
- case 'MOMENT:NEXT|YEARORNUMBER|UNITOFTIME':
245
- return this.createMomentNumberInterval(prefix, tokens);
246
- case 'MOMENT:NUMBER|UNITOFTIME|AGO':
247
- case 'MOMENT:YEARORNUMBER|UNITOFTIME|AGO':
248
- return this.createMomentNumberIntervalAgo(prefix, tokens);
249
- case 'MOMENT:NUMBER|UNITOFTIME|FROM|NOW':
250
- case 'MOMENT:YEARORNUMBER|UNITOFTIME|FROM|NOW':
251
- return this.createMomentNumberIntervalFromNow(prefix, tokens);
252
- case 'MOMENT:NUMBER|UNITOFTIME':
253
- case 'MOMENT:YEARORNUMBER|UNITOFTIME':
254
- return this.createMomentNumberUnit(prefix, tokens);
255
- case 'MOMENT:DATE|TIME':
256
- case 'MOMENT:DATE':
257
- case 'MOMENT:YEARORNUMBER':
258
- return this.createMomentNumber(prefix, tokens);
259
- case 'MOMENT:NOW':
260
- case 'MOMENT:TODAY':
261
- case 'MOMENT:YESTERDAY':
262
- case 'MOMENT:TOMORROW':
263
- return this.createMomentNow(prefix, tokens);
274
+ case 'MERGE:LAST|UNITOFTIME':
275
+ case 'MERGE:LAST|DAYOFWEEK':
276
+ case 'MERGE:THIS|UNITOFTIME':
277
+ case 'MERGE:NEXT|UNITOFTIME':
278
+ case 'MERGE:NEXT|DAYOFWEEK':
279
+ return this.createIntervalMoment(prefix, tokens);
280
+ case 'MERGE:LAST|NUMBER|UNITOFTIME':
281
+ case 'MERGE:LAST|YEAR|UNITOFTIME':
282
+ case 'MERGE:NEXT|NUMBER|UNITOFTIME':
283
+ case 'MERGE:NEXT|YEAR|UNITOFTIME':
284
+ return this.createSpanMoment(prefix, tokens);
285
+ case 'MERGE:NUMBER|UNITOFTIME|AGO':
286
+ case 'MERGE:YEAR|UNITOFTIME|AGO':
287
+ case 'MERGE:NUMBER|UNITOFTIME|FROM|NOW':
288
+ case 'MERGE:YEAR|UNITOFTIME|FROM|NOW':
289
+ return this.createOffsetMoment(prefix, tokens);
290
+ case 'MERGE:NUMBER|UNITOFTIME':
291
+ case 'MERGE:YEAR|UNITOFTIME':
292
+ return this.createDateDuration(prefix, tokens);
293
+ case 'MERGE:DATE|TIME':
294
+ case 'MERGE:DATE':
295
+ case 'MERGE:YEAR':
296
+ return this.createAbsoluteMoment(prefix, tokens);
297
+ case 'MERGE:NOW':
298
+ case 'MERGE:TODAY':
299
+ case 'MERGE:YESTERDAY':
300
+ case 'MERGE:TOMORROW':
301
+ return this.createNamedMoment(prefix, tokens);
264
302
  default:
265
303
  return undefined;
266
304
  }
@@ -274,31 +312,50 @@ class DateParser extends base_parser_1.BaseParser {
274
312
  : this.tokens[position].type.startsWith(value);
275
313
  }
276
314
  handleRange(clauses) {
277
- if (this.isMatchingToken(this.index, 'MOMENT', false) &&
315
+ if (this.isMatchingToken(this.index, 'MERGE', false) &&
278
316
  (this.isMatchingToken(this.index + 1, 'TO', true) ||
279
317
  this.isMatchingToken(this.index + 1, 'FOR', true)) &&
280
- this.isMatchingToken(this.index + 2, 'MOMENT', false)) {
281
- const startMoment = DateParser.createMomentFromToken(undefined, this.tokens[this.index]);
282
- const endMoment = DateParser.createMomentFromToken(undefined, this.tokens[this.index + 2]);
283
- const operator = this.tokens[this.index + 1].type;
318
+ this.isMatchingToken(this.index + 2, 'MERGE', false)) {
319
+ const startToken = this.tokens[this.index];
320
+ const operator = this.tokens[this.index + 1].type; // TO | FOR
321
+ const endToken = this.tokens[this.index + 2];
322
+ const startClause = DateParser.createClauseFromMerged(undefined, startToken);
284
323
  this.index += 3;
285
- if (startMoment === undefined || endMoment === undefined) {
324
+ if (startClause === undefined || !('moment' in startClause)) {
286
325
  return false;
287
326
  }
288
- const dateRange = {
289
- start: startMoment,
290
- operator,
291
- end: endMoment,
292
- };
293
- clauses.push(dateRange);
327
+ if (operator === 'TO') {
328
+ const endClause = DateParser.createClauseFromMerged(undefined, endToken);
329
+ if (endClause === undefined || !('moment' in endClause)) {
330
+ return false;
331
+ }
332
+ const clause = {
333
+ operator: 'TO_RANGE',
334
+ from: startClause.moment,
335
+ to: endClause.moment,
336
+ };
337
+ clauses.push(clause);
338
+ }
339
+ else {
340
+ const endDuration = DateParser.createDurationFromMerged(endToken);
341
+ if (endDuration === undefined) {
342
+ return false;
343
+ }
344
+ const clause = {
345
+ operator: 'FOR_RANGE',
346
+ from: startClause.moment,
347
+ duration: endDuration,
348
+ };
349
+ clauses.push(clause);
350
+ }
294
351
  return true;
295
352
  }
296
353
  return false;
297
354
  }
298
- handleMoment(prefix, clauses) {
355
+ handleMerged(prefix, clauses) {
299
356
  const token = this.getNext();
300
- if (token.type.startsWith('MOMENT')) {
301
- const clause = DateParser.createMomentFromToken(prefix, token);
357
+ if (token.type.startsWith('MERGE')) {
358
+ const clause = DateParser.createClauseFromMerged(prefix, token);
302
359
  this.index++;
303
360
  if (clause === undefined) {
304
361
  return false;