@qrvey/formula-lang 0.1.2 → 0.2.0

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 (252) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/__tests__/integration/__mocks__/elasticsearchScripts.ts +21 -0
  3. package/__tests__/integration/__mocks__/sqlScripts.ts +20 -0
  4. package/__tests__/integration/elasticsearch.test.ts +158 -0
  5. package/__tests__/integration/expression.test.ts +22 -0
  6. package/__tests__/integration/redshift.test.ts +127 -0
  7. package/__tests__/integration/sonwflake.test.ts +123 -0
  8. package/__tests__/unit/parser.test.ts +106 -0
  9. package/__tests__/{src → unit}/transpiler.test.ts +0 -17
  10. package/bitbucket-pipelines.yml +63 -0
  11. package/dist/constants/index.d.ts +12 -2
  12. package/dist/constants/index.js +21 -1
  13. package/dist/constants/index.js.map +1 -1
  14. package/dist/constants/interfaces.d.ts +8 -2
  15. package/dist/errors/definitions.d.ts +20 -5
  16. package/dist/errors/definitions.js +28 -5
  17. package/dist/errors/definitions.js.map +1 -1
  18. package/dist/errors/engineErrors.d.ts +2 -0
  19. package/dist/errors/engineErrors.js +21 -0
  20. package/dist/errors/engineErrors.js.map +1 -0
  21. package/dist/errors/index.d.ts +2 -5
  22. package/dist/errors/index.js +4 -38
  23. package/dist/errors/index.js.map +1 -1
  24. package/dist/functions/abs.d.ts +5 -0
  25. package/dist/functions/abs.js +35 -0
  26. package/dist/functions/abs.js.map +1 -0
  27. package/dist/functions/datedif.d.ts +5 -0
  28. package/dist/functions/datedif.js +61 -0
  29. package/dist/functions/datedif.js.map +1 -0
  30. package/dist/functions/day.d.ts +5 -0
  31. package/dist/functions/day.js +36 -0
  32. package/dist/functions/day.js.map +1 -0
  33. package/dist/functions/hour.d.ts +5 -0
  34. package/dist/functions/hour.js +36 -0
  35. package/dist/functions/hour.js.map +1 -0
  36. package/dist/functions/if.d.ts +5 -0
  37. package/dist/functions/if.js +49 -0
  38. package/dist/functions/if.js.map +1 -0
  39. package/dist/functions/ifs.d.ts +5 -0
  40. package/dist/functions/ifs.js +71 -0
  41. package/dist/functions/ifs.js.map +1 -0
  42. package/dist/functions/index.js +20 -0
  43. package/dist/functions/index.js.map +1 -1
  44. package/dist/functions/mid.d.ts +3 -0
  45. package/dist/functions/mid.js +15 -12
  46. package/dist/functions/mid.js.map +1 -1
  47. package/dist/functions/minute.d.ts +5 -0
  48. package/dist/functions/minute.js +36 -0
  49. package/dist/functions/minute.js.map +1 -0
  50. package/dist/functions/month.d.ts +5 -0
  51. package/dist/functions/month.js +36 -0
  52. package/dist/functions/month.js.map +1 -0
  53. package/dist/functions/second.d.ts +5 -0
  54. package/dist/functions/second.js +36 -0
  55. package/dist/functions/second.js.map +1 -0
  56. package/dist/functions/year.d.ts +5 -0
  57. package/dist/functions/year.js +36 -0
  58. package/dist/functions/year.js.map +1 -0
  59. package/dist/grammar/generated/qformula.lang.js +10 -10
  60. package/dist/grammar/generated/qformula.lang.js.map +1 -1
  61. package/dist/parser/json-parser.js +42 -6
  62. package/dist/parser/json-parser.js.map +1 -1
  63. package/dist/transpiler/index.d.ts +9 -7
  64. package/dist/transpiler/index.js +38 -27
  65. package/dist/transpiler/index.js.map +1 -1
  66. package/dist/transpiler/validateFuncStructure.d.ts +2 -0
  67. package/dist/transpiler/validateFuncStructure.js +37 -0
  68. package/dist/transpiler/validateFuncStructure.js.map +1 -0
  69. package/dist/utils/customFunctions.d.ts +3 -0
  70. package/dist/utils/customFunctions.js +21 -0
  71. package/dist/utils/customFunctions.js.map +1 -0
  72. package/dist/utils/elasticsearch/index.d.ts +2 -0
  73. package/dist/utils/elasticsearch/index.js +16 -0
  74. package/dist/utils/elasticsearch/index.js.map +1 -0
  75. package/dist/utils/elasticsearch/scripts.d.ts +10 -0
  76. package/dist/utils/elasticsearch/scripts.js +36 -0
  77. package/dist/utils/elasticsearch/scripts.js.map +1 -0
  78. package/dist/utils/getMonthMaxDayAllowed.d.ts +7 -0
  79. package/dist/utils/getMonthMaxDayAllowed.js +22 -0
  80. package/dist/utils/getMonthMaxDayAllowed.js.map +1 -0
  81. package/dist/utils/getNodeValue.d.ts +2 -0
  82. package/dist/utils/getNodeValue.js +9 -0
  83. package/dist/utils/getNodeValue.js.map +1 -0
  84. package/dist/utils/index.d.ts +9 -4
  85. package/dist/utils/index.js +9 -3
  86. package/dist/utils/index.js.map +1 -1
  87. package/dist/utils/isDateParam.d.ts +2 -0
  88. package/dist/utils/isDateParam.js +8 -0
  89. package/dist/utils/isDateParam.js.map +1 -0
  90. package/dist/utils/isNumberParam.d.ts +2 -0
  91. package/dist/utils/isNumberParam.js +8 -0
  92. package/dist/utils/isNumberParam.js.map +1 -0
  93. package/dist/utils/isPositiveNumberParam.d.ts +2 -0
  94. package/dist/utils/isPositiveNumberParam.js +8 -0
  95. package/dist/utils/isPositiveNumberParam.js.map +1 -0
  96. package/dist/utils/isStringParam.d.ts +2 -0
  97. package/dist/utils/isStringParam.js +8 -0
  98. package/dist/utils/isStringParam.js.map +1 -0
  99. package/dist/utils/isValidDate.d.ts +1 -0
  100. package/dist/utils/isValidDate.js +4 -0
  101. package/dist/utils/isValidDate.js.map +1 -0
  102. package/dist/utils/sql/index.d.ts +1 -0
  103. package/dist/utils/sql/index.js +2 -0
  104. package/dist/utils/sql/index.js.map +1 -0
  105. package/dist/utils/sql/scripts.d.ts +3 -0
  106. package/dist/utils/sql/scripts.js +39 -0
  107. package/dist/utils/sql/scripts.js.map +1 -0
  108. package/package.json +4 -1
  109. package/pkg/dist/constants/index.d.ts +42 -0
  110. package/pkg/dist/constants/index.js +86 -0
  111. package/pkg/dist/constants/index.js.map +1 -0
  112. package/pkg/dist/constants/interfaces.d.ts +62 -0
  113. package/pkg/dist/constants/interfaces.js +2 -0
  114. package/pkg/dist/constants/interfaces.js.map +1 -0
  115. package/pkg/dist/errors/definitions.d.ts +26 -0
  116. package/pkg/dist/errors/definitions.js +42 -0
  117. package/pkg/dist/errors/definitions.js.map +1 -0
  118. package/pkg/dist/errors/elasticsearch.d.ts +24 -0
  119. package/pkg/dist/errors/elasticsearch.js +27 -0
  120. package/pkg/dist/errors/elasticsearch.js.map +1 -0
  121. package/pkg/dist/errors/engineErrors.d.ts +2 -0
  122. package/pkg/dist/errors/engineErrors.js +21 -0
  123. package/pkg/dist/errors/engineErrors.js.map +1 -0
  124. package/pkg/dist/errors/index.d.ts +2 -0
  125. package/pkg/dist/errors/index.js +5 -0
  126. package/pkg/dist/errors/index.js.map +1 -0
  127. package/pkg/dist/errors/snowflake.d.ts +15 -0
  128. package/pkg/dist/errors/snowflake.js +17 -0
  129. package/pkg/dist/errors/snowflake.js.map +1 -0
  130. package/pkg/dist/functions/abs.d.ts +5 -0
  131. package/pkg/dist/functions/abs.js +35 -0
  132. package/pkg/dist/functions/abs.js.map +1 -0
  133. package/pkg/dist/functions/datedif.d.ts +5 -0
  134. package/pkg/dist/functions/datedif.js +58 -0
  135. package/pkg/dist/functions/datedif.js.map +1 -0
  136. package/pkg/dist/functions/day.d.ts +5 -0
  137. package/pkg/dist/functions/day.js +36 -0
  138. package/pkg/dist/functions/day.js.map +1 -0
  139. package/pkg/dist/functions/hour.d.ts +5 -0
  140. package/pkg/dist/functions/hour.js +36 -0
  141. package/pkg/dist/functions/hour.js.map +1 -0
  142. package/pkg/dist/functions/if.d.ts +5 -0
  143. package/pkg/dist/functions/if.js +49 -0
  144. package/pkg/dist/functions/if.js.map +1 -0
  145. package/pkg/dist/functions/ifs.d.ts +5 -0
  146. package/pkg/dist/functions/ifs.js +71 -0
  147. package/pkg/dist/functions/ifs.js.map +1 -0
  148. package/pkg/dist/functions/index.d.ts +4 -0
  149. package/pkg/dist/functions/index.js +29 -0
  150. package/pkg/dist/functions/index.js.map +1 -0
  151. package/pkg/dist/functions/mid.d.ts +5 -0
  152. package/pkg/dist/functions/mid.js +51 -0
  153. package/pkg/dist/functions/mid.js.map +1 -0
  154. package/pkg/dist/functions/minute.d.ts +5 -0
  155. package/pkg/dist/functions/minute.js +36 -0
  156. package/pkg/dist/functions/minute.js.map +1 -0
  157. package/pkg/dist/functions/month.d.ts +5 -0
  158. package/pkg/dist/functions/month.js +36 -0
  159. package/pkg/dist/functions/month.js.map +1 -0
  160. package/pkg/dist/functions/second.d.ts +5 -0
  161. package/pkg/dist/functions/second.js +36 -0
  162. package/pkg/dist/functions/second.js.map +1 -0
  163. package/pkg/dist/functions/year.d.ts +5 -0
  164. package/pkg/dist/functions/year.js +36 -0
  165. package/pkg/dist/functions/year.js.map +1 -0
  166. package/pkg/dist/grammar/generated/qformula.lang.js +43 -0
  167. package/pkg/dist/grammar/generated/qformula.lang.js.map +1 -0
  168. package/pkg/dist/grammar/qformula.grammar.d.ts +1 -0
  169. package/pkg/dist/grammar/qformula.grammar.js +2 -0
  170. package/pkg/dist/grammar/qformula.grammar.js.map +1 -0
  171. package/pkg/dist/index.js +29 -0
  172. package/pkg/dist/index.js.map +1 -0
  173. package/pkg/dist/parser/json-parser.js +139 -0
  174. package/pkg/dist/parser/json-parser.js.map +1 -0
  175. package/pkg/dist/transpiler/index.d.ts +17 -0
  176. package/pkg/dist/transpiler/index.js +82 -0
  177. package/pkg/dist/transpiler/index.js.map +1 -0
  178. package/pkg/dist/transpiler/validateFuncStructure.d.ts +2 -0
  179. package/pkg/dist/transpiler/validateFuncStructure.js +35 -0
  180. package/pkg/dist/transpiler/validateFuncStructure.js.map +1 -0
  181. package/pkg/dist/utils/customFunctions.d.ts +2 -0
  182. package/pkg/dist/utils/customFunctions.js +11 -0
  183. package/pkg/dist/utils/customFunctions.js.map +1 -0
  184. package/pkg/dist/utils/elasticsearch/index.d.ts +1 -0
  185. package/pkg/dist/utils/elasticsearch/index.js +15 -0
  186. package/pkg/dist/utils/elasticsearch/index.js.map +1 -0
  187. package/pkg/dist/utils/elasticsearch/scripts.d.ts +9 -0
  188. package/pkg/dist/utils/elasticsearch/scripts.js +33 -0
  189. package/pkg/dist/utils/elasticsearch/scripts.js.map +1 -0
  190. package/pkg/dist/utils/getMonthMaxDayAllowed.d.ts +7 -0
  191. package/pkg/dist/utils/getMonthMaxDayAllowed.js +22 -0
  192. package/pkg/dist/utils/getMonthMaxDayAllowed.js.map +1 -0
  193. package/pkg/dist/utils/getNodeValue.d.ts +2 -0
  194. package/pkg/dist/utils/getNodeValue.js +9 -0
  195. package/pkg/dist/utils/getNodeValue.js.map +1 -0
  196. package/pkg/dist/utils/index.d.ts +8 -0
  197. package/pkg/dist/utils/index.js +9 -0
  198. package/pkg/dist/utils/index.js.map +1 -0
  199. package/pkg/dist/utils/isDateParam.d.ts +2 -0
  200. package/pkg/dist/utils/isDateParam.js +10 -0
  201. package/pkg/dist/utils/isDateParam.js.map +1 -0
  202. package/pkg/dist/utils/isNumberParam.d.ts +2 -0
  203. package/pkg/dist/utils/isNumberParam.js +8 -0
  204. package/pkg/dist/utils/isNumberParam.js.map +1 -0
  205. package/pkg/dist/utils/isPositiveNumberParam.d.ts +2 -0
  206. package/pkg/dist/utils/isPositiveNumberParam.js +8 -0
  207. package/pkg/dist/utils/isPositiveNumberParam.js.map +1 -0
  208. package/pkg/dist/utils/isStringParam.d.ts +2 -0
  209. package/pkg/dist/utils/isStringParam.js +8 -0
  210. package/pkg/dist/utils/isStringParam.js.map +1 -0
  211. package/pkg/dist/utils/isValidDate.d.ts +1 -0
  212. package/pkg/dist/utils/isValidDate.js +4 -0
  213. package/pkg/dist/utils/isValidDate.js.map +1 -0
  214. package/pkg/dist/utils/sql/scripts.d.ts +2 -0
  215. package/pkg/dist/utils/sql/scripts.js +39 -0
  216. package/pkg/dist/utils/sql/scripts.js.map +1 -0
  217. package/__tests__/src/parser.test.ts +0 -29
  218. package/coverage/clover.xml +0 -228
  219. package/coverage/coverage-final.json +0 -12
  220. package/coverage/lcov-report/base.css +0 -224
  221. package/coverage/lcov-report/block-navigation.js +0 -87
  222. package/coverage/lcov-report/favicon.png +0 -0
  223. package/coverage/lcov-report/index.html +0 -236
  224. package/coverage/lcov-report/prettify.css +0 -1
  225. package/coverage/lcov-report/prettify.js +0 -2
  226. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  227. package/coverage/lcov-report/sorter.js +0 -196
  228. package/coverage/lcov-report/src/constants/index.html +0 -116
  229. package/coverage/lcov-report/src/constants/index.ts.html +0 -307
  230. package/coverage/lcov-report/src/errors/definitions.ts.html +0 -154
  231. package/coverage/lcov-report/src/errors/index.html +0 -131
  232. package/coverage/lcov-report/src/errors/index.ts.html +0 -217
  233. package/coverage/lcov-report/src/functions/index.html +0 -131
  234. package/coverage/lcov-report/src/functions/index.ts.html +0 -103
  235. package/coverage/lcov-report/src/functions/mid.ts.html +0 -238
  236. package/coverage/lcov-report/src/grammar/generated/index.html +0 -116
  237. package/coverage/lcov-report/src/grammar/generated/qformula.lang.js.html +0 -220
  238. package/coverage/lcov-report/src/grammar/index.html +0 -116
  239. package/coverage/lcov-report/src/grammar/qformula.grammar.ts.html +0 -88
  240. package/coverage/lcov-report/src/index.html +0 -116
  241. package/coverage/lcov-report/src/index.ts.html +0 -160
  242. package/coverage/lcov-report/src/parser/index.html +0 -116
  243. package/coverage/lcov-report/src/parser/json-parser.ts.html +0 -475
  244. package/coverage/lcov-report/src/transpiler/index.html +0 -116
  245. package/coverage/lcov-report/src/transpiler/index.ts.html +0 -412
  246. package/coverage/lcov-report/src/utils/index.html +0 -116
  247. package/coverage/lcov-report/src/utils/index.ts.html +0 -103
  248. package/coverage/lcov.info +0 -405
  249. package/dist/models/ast.models.d.ts +0 -29
  250. package/dist/models/ast.models.js +0 -1
  251. package/dist/utils/utils.d.ts +0 -4
  252. package/dist/utils/utils.js +0 -3
@@ -1,23 +1,27 @@
1
- import { AST_TYPES, ERROR_DICTIONARY, ERROR_LIST } from '../constants';
2
- import { GenericError } from '../errors/definitions';
1
+ import { AST_TYPES, CustomOperators } from '../constants';
2
+ import { UnknownFunctionError } from '../errors/definitions';
3
3
  import { functionList } from '../functions';
4
+ import { customFunction as customFunctionUtil, customDateCast } from '../utils';
5
+ import { validateFuncStructure } from './validateFuncStructure';
4
6
  export class Transpiler {
5
7
  constructor(ast, engine) {
8
+ this.customFunctionList = new Set();
6
9
  this.ast = ast;
7
10
  this.engine = engine;
8
11
  }
9
12
  get() {
10
13
  try {
11
14
  const { body } = this.ast;
15
+ const expression = body ? this.processNode(body) : undefined;
12
16
  return {
13
17
  valid: body !== undefined,
14
- expression: body ? this.processNode(body) : undefined,
18
+ expression: this.unshiftCustomFunctions(expression),
15
19
  };
16
20
  }
17
21
  catch (error) {
18
22
  return {
19
23
  valid: false,
20
- error: new GenericError(error.message),
24
+ error,
21
25
  };
22
26
  }
23
27
  }
@@ -33,43 +37,50 @@ export class Transpiler {
33
37
  return nodes[type].call(this, expression);
34
38
  }
35
39
  literal({ value, dataType }) {
40
+ if (dataType === 'date')
41
+ value = customDateCast(this.engine)(value);
36
42
  if (dataType === 'string')
37
43
  value = `'${value}'`;
38
- return value;
44
+ return { value, dataType };
39
45
  }
40
- unaryExpression({ operator, right }) {
41
- const rightResult = this.processNode(right);
42
- return `(${operator} ${rightResult})`;
46
+ unaryExpression({ operator, right, }) {
47
+ const { value: rightResult } = this.processNode(right);
48
+ const value = `(${operator} ${rightResult})`;
49
+ return { value };
43
50
  }
44
- binaryExpression({ left, operator, right }) {
45
- const leftResult = this.processNode(left);
46
- const rightResult = this.processNode(right);
47
- return `(${leftResult} ${operator} ${rightResult})`;
51
+ binaryExpression({ left, operator, right, }) {
52
+ var _a, _b;
53
+ const { value: leftResult } = this.processNode(left);
54
+ const { value: rightResult } = this.processNode(right);
55
+ const value = `(${leftResult} ${(_b = (_a = CustomOperators[this.engine]) === null || _a === void 0 ? void 0 : _a[operator]) !== null && _b !== void 0 ? _b : operator} ${rightResult})`;
56
+ return { value };
48
57
  }
49
58
  functionCall(node) {
50
59
  const { name, arguments: args } = node;
51
60
  const func = functionList[name];
52
61
  if (!func)
53
- throw Object.assign({ node }, ERROR_DICTIONARY[ERROR_LIST.unknownFunction]);
62
+ throw new UnknownFunctionError(node);
63
+ const customFunction = customFunctionUtil(this.engine, name);
64
+ if (customFunction)
65
+ this.customFunctionList.add(customFunction);
54
66
  const parameters = args.map((param) => this.processNode(param));
55
- return this.executer(func, parameters, node);
67
+ const value = this.executer(func, parameters, node);
68
+ return { value };
56
69
  }
57
70
  executer(func, args, node) {
58
- const params = (func === null || func === void 0 ? void 0 : func.parameters) ? [...func.parameters] : [];
59
- for (const [index, element] of params.entries()) {
60
- const value = args[index];
61
- if (!value && element.optional)
62
- continue;
63
- if (!value && !element.optional)
64
- throw Object.assign({ node }, ERROR_DICTIONARY[ERROR_LIST.missingArg]);
65
- element.validator.forEach((validatorFunction) => {
66
- const validator = validatorFunction(value);
67
- if (!validator.valid)
68
- throw Object.assign({ node }, validator);
69
- });
70
- }
71
+ validateFuncStructure(node, func, args);
72
+ args = args.map((item) => item.value);
71
73
  return func.transpiler[this.engine](...args);
72
74
  }
75
+ unshiftCustomFunctions(expression) {
76
+ if (!expression)
77
+ return undefined;
78
+ const { value } = expression;
79
+ const customs = Array.from(this.customFunctionList).join('\n');
80
+ if (customs)
81
+ return `${customs}\n${value}`;
82
+ return value;
83
+ }
73
84
  }
74
85
  export function TranspileAST(ast, engine) {
75
86
  const transpiler = new Transpiler(ast, engine);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transpiler/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transpiler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAYnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,cAAc,IAAI,kBAAkB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,OAAO,UAAU;IAKnB,YAAY,GAAe,EAAE,MAAe;QAFpC,uBAAkB,GAAG,IAAI,GAAG,EAAE,CAAC;QAGnC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,GAAG;QACC,IAAI;YACA,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7D,OAAO;gBACH,KAAK,EAAE,IAAI,KAAK,SAAS;gBACzB,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC;aACtD,CAAC;SACL;QAAC,OAAO,KAAc,EAAE;YACrB,OAAO;gBACH,KAAK,EAAE,KAAK;gBACZ,KAAK;aACR,CAAC;SACL;IACL,CAAC;IAED,WAAW,CAAC,UAAqB;QAC7B,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;QAC5B,MAAM,KAAK,GAAQ;YACf,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO;YAClC,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO;YACjC,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,eAAe;YACjD,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,gBAAgB;YACnD,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY;SAC9C,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAc;QACnC,IAAI,QAAQ,KAAK,MAAM;YAAE,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,QAAQ,KAAK,QAAQ;YAAE,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC;QAChD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAED,eAAe,CAAC,EACZ,QAAQ,EACR,KAAK,GACY;QACjB,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,QAAQ,IAAI,WAAW,GAAG,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,gBAAgB,CAAC,EACb,IAAI,EACJ,QAAQ,EACR,KAAK,GACa;;QAClB,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,UAAU,IACxB,MAAA,MAAA,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,0CAAG,QAAQ,CAAC,mCAAI,QAChD,IAAI,WAAW,GAAG,CAAC;QACnB,OAAO,EAAE,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,IAAqB;QAC9B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QACvC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAEhD,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7D,IAAI,cAAc;YAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAEhE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QACpD,OAAO,EAAE,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,QAAQ,CACJ,IAAwB,EACxB,IAA8B,EAC9B,IAAqB;QAErB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,sBAAsB,CAClB,UAAyC;QAEzC,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAClC,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,OAAO;YAAE,OAAO,GAAG,OAAO,KAAK,KAAK,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AAED,MAAM,UAAU,YAAY,CACxB,GAAe,EACf,MAAe;IAEf,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { FunctionCallAST, FunctionDefinition, ProcessNodeResult } from '../constants/interfaces';
2
+ export declare function validateFuncStructure(node: FunctionCallAST, definition: FunctionDefinition, args: Array<ProcessNodeResult>): boolean;
@@ -0,0 +1,37 @@
1
+ import { InvalidArgumentError, MissingArgumentError, TooManyArgumentsError, } from '../errors';
2
+ export function validateFuncStructure(node, definition, args) {
3
+ var _a;
4
+ let parameterIndex = 0;
5
+ let argumentIndex = 0;
6
+ const parameters = definition.parameters || [];
7
+ const incrementCounter = () => {
8
+ parameterIndex += 1;
9
+ argumentIndex += 1;
10
+ };
11
+ while (parameterIndex < parameters.length) {
12
+ const parameter = parameters[parameterIndex];
13
+ const { value, dataType } = (_a = args[argumentIndex]) !== null && _a !== void 0 ? _a : {};
14
+ if (!value && parameter.optional) {
15
+ incrementCounter();
16
+ continue;
17
+ }
18
+ if (!value && !parameter.optional)
19
+ throw new MissingArgumentError(node);
20
+ parameter.validator.forEach((validatorFunction) => {
21
+ const validator = validatorFunction(value, dataType);
22
+ if (!validator.valid)
23
+ throw new InvalidArgumentError(node, validator);
24
+ });
25
+ incrementCounter();
26
+ const hasMoreArguments = parameterIndex === parameters.length &&
27
+ argumentIndex !== args.length;
28
+ const isRecursive = typeof (definition === null || definition === void 0 ? void 0 : definition.recursiveStartIn) === 'number';
29
+ if (hasMoreArguments && isRecursive) {
30
+ parameterIndex = definition.recursiveStartIn;
31
+ }
32
+ }
33
+ if (argumentIndex < args.length)
34
+ throw new TooManyArgumentsError(node);
35
+ return true;
36
+ }
37
+ //# sourceMappingURL=validateFuncStructure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateFuncStructure.js","sourceRoot":"","sources":["../../src/transpiler/validateFuncStructure.ts"],"names":[],"mappings":"AAKA,OAAO,EACH,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,GACxB,MAAM,WAAW,CAAC;AAEnB,MAAM,UAAU,qBAAqB,CACjC,IAAqB,EACrB,UAA8B,EAC9B,IAA8B;;IAE9B,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;IAC/C,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC1B,cAAc,IAAI,CAAC,CAAC;QACpB,aAAa,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC;IACF,OAAO,cAAc,GAAG,UAAU,CAAC,MAAM,EAAE;QACvC,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAA,IAAI,CAAC,aAAa,CAAC,mCAAI,EAAE,CAAC;QAEtD,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,QAAQ,EAAE;YAC9B,gBAAgB,EAAE,CAAC;YACnB,SAAS;SACZ;QACD,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACxE,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,iBAAiB,EAAE,EAAE;YAC9C,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACrD,IAAI,CAAC,SAAS,CAAC,KAAK;gBAChB,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,gBAAgB,EAAE,CAAC;QACnB,MAAM,gBAAgB,GAClB,cAAc,KAAK,UAAU,CAAC,MAAM;YACpC,aAAa,KAAK,IAAI,CAAC,MAAM,CAAC;QAClC,MAAM,WAAW,GAAG,OAAO,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,gBAAgB,CAAA,KAAK,QAAQ,CAAC;QACrE,IAAI,gBAAgB,IAAI,WAAW,EAAE;YACjC,cAAc,GAAG,UAAU,CAAC,gBAA0B,CAAC;SAC1D;KACJ;IAED,IAAI,aAAa,GAAG,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ENGINES } from '../constants';
2
+ export declare function customFunction(engine: ENGINES, func: string): string | false;
3
+ export declare function customDateCast(engine: ENGINES): Function;
@@ -0,0 +1,21 @@
1
+ import { ENGINES } from '../constants';
2
+ import { customFunctionsList as elasticsearch, toDate as toDateES, } from './elasticsearch';
3
+ import { toDate as toDateSQL } from './sql';
4
+ export function customFunction(engine, func) {
5
+ switch (engine) {
6
+ case ENGINES.ELASTICSEARCH:
7
+ return elasticsearch(func);
8
+ default:
9
+ return false;
10
+ }
11
+ }
12
+ export function customDateCast(engine) {
13
+ switch (engine) {
14
+ case ENGINES.ELASTICSEARCH:
15
+ return toDateES;
16
+ case ENGINES.REDSHIFT:
17
+ case ENGINES.SNOWFLAKE:
18
+ return toDateSQL;
19
+ }
20
+ }
21
+ //# sourceMappingURL=customFunctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customFunctions.js","sourceRoot":"","sources":["../../src/utils/customFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACH,mBAAmB,IAAI,aAAa,EACpC,MAAM,IAAI,QAAQ,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,UAAU,cAAc,CAAC,MAAe,EAAE,IAAY;IACxD,QAAQ,MAAM,EAAE;QACZ,KAAK,OAAO,CAAC,aAAa;YACtB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;QAC/B;YACI,OAAO,KAAK,CAAC;KACpB;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAe;IAC1C,QAAQ,MAAM,EAAE;QACZ,KAAK,OAAO,CAAC,aAAa;YACtB,OAAO,QAAQ,CAAC;QACpB,KAAK,OAAO,CAAC,QAAQ,CAAC;QACtB,KAAK,OAAO,CAAC,SAAS;YAClB,OAAO,SAAS,CAAC;KACxB;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { toDate } from './scripts';
2
+ export declare function customFunctionsList(func: string): string | false;
@@ -0,0 +1,16 @@
1
+ import { dateFormatScript } from './scripts';
2
+ export { toDate } from './scripts';
3
+ export function customFunctionsList(func) {
4
+ switch (func) {
5
+ case 'DAY':
6
+ case 'MONTH':
7
+ case 'YEAR':
8
+ case 'HOUR':
9
+ case 'MINUTE':
10
+ case 'SECOND':
11
+ return dateFormatScript;
12
+ default:
13
+ return false;
14
+ }
15
+ }
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/elasticsearch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC5C,QAAQ,IAAI,EAAE;QACV,KAAK,KAAK,CAAC;QACX,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACT,OAAO,gBAAgB,CAAC;QAC5B;YACI,OAAO,KAAK,CAAC;KACpB;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { DateDifUnitParam } from '../../constants/interfaces';
2
+ export declare function toDate(value: string): string;
3
+ export declare const dateFormatScript: string;
4
+ export declare const dayScript: (value: any) => string;
5
+ export declare const monthScript: (value: any) => string;
6
+ export declare const yearScript: (value: any) => string;
7
+ export declare const hourScript: (value: any) => string;
8
+ export declare const minuteScript: (value: any) => string;
9
+ export declare const secondScript: (value: any) => string;
10
+ export declare function dateDif(start: any, end: any, unit: DateDifUnitParam): string;
@@ -0,0 +1,36 @@
1
+ var SCRIPT_NAMES;
2
+ (function (SCRIPT_NAMES) {
3
+ SCRIPT_NAMES["dateFormat"] = "DATE_FORMAT_SCRIPT";
4
+ })(SCRIPT_NAMES || (SCRIPT_NAMES = {}));
5
+ export function toDate(value) {
6
+ return `ZonedDateTime.parse("${value}")`;
7
+ }
8
+ export const dateFormatScript = `
9
+ String ${SCRIPT_NAMES.dateFormat}(def date_value, String format) {
10
+ def isCustomDate = (date_value instanceof JodaCompatibleZonedDateTime || date_value instanceof ZonedDateTime);
11
+ if (date_value instanceof List && !isCustomDate) {
12
+ if (date_value.empty) return null;
13
+ date_value = date_value.value;
14
+ }
15
+ return DateTimeFormatter.ofPattern(format).format(date_value)
16
+ }
17
+ `;
18
+ function dateFormatToInt(value, format) {
19
+ return `Integer.parseInt(${SCRIPT_NAMES.dateFormat}(${value}, '${format}'))`;
20
+ }
21
+ export const dayScript = (value) => dateFormatToInt(value, 'dd');
22
+ export const monthScript = (value) => dateFormatToInt(value, 'MM');
23
+ export const yearScript = (value) => dateFormatToInt(value, 'yyyy');
24
+ export const hourScript = (value) => dateFormatToInt(value, 'HH');
25
+ export const minuteScript = (value) => dateFormatToInt(value, 'mm');
26
+ export const secondScript = (value) => dateFormatToInt(value, 'ss');
27
+ export function dateDif(start, end, unit) {
28
+ const units = {
29
+ Y: 'YEARS',
30
+ M: 'MONTHS',
31
+ D: 'DAYS',
32
+ };
33
+ const currentUnit = units[unit];
34
+ return `ChronoUnit.${currentUnit}.between(${start}, ${end})`;
35
+ }
36
+ //# sourceMappingURL=scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../../src/utils/elasticsearch/scripts.ts"],"names":[],"mappings":"AAEA,IAAK,YAEJ;AAFD,WAAK,YAAY;IACb,iDAAiC,CAAA;AACrC,CAAC,EAFI,YAAY,KAAZ,YAAY,QAEhB;AAED,MAAM,UAAU,MAAM,CAAC,KAAa;IAChC,OAAO,wBAAwB,KAAK,IAAI,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG;SACvB,YAAY,CAAC,UAAU;;;;;;;;CAQ/B,CAAC;AAEF,SAAS,eAAe,CAAC,KAAU,EAAE,MAAc;IAC/C,OAAO,oBAAoB,YAAY,CAAC,UAAU,IAAI,KAAK,MAAM,MAAM,KAAK,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAEzE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAEvE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAEzE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAEzE,MAAM,UAAU,OAAO,CAAC,KAAU,EAAE,GAAQ,EAAE,IAAsB;IAChE,MAAM,KAAK,GAAG;QACV,CAAC,EAAE,OAAO;QACV,CAAC,EAAE,QAAQ;QACX,CAAC,EAAE,MAAM;KACZ,CAAC;IACF,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,cAAc,WAAW,YAAY,KAAK,KAAK,GAAG,GAAG,CAAC;AACjE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Gets the max number of days allowed for a date
3
+ * @param month 0 index month of the year
4
+ * @param year year of a date
5
+ * @returns number with the max number allowed. -1 if month does not exist in array list
6
+ */
7
+ export declare function getMonthMaxDayAllowed(month: number, year: number): number;
@@ -0,0 +1,22 @@
1
+ function isLeapYear(year) {
2
+ return year % 4 === 0 && year % 100 !== 0;
3
+ }
4
+ const MONTH_MAX_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
5
+ /**
6
+ * Gets the max number of days allowed for a date
7
+ * @param month 0 index month of the year
8
+ * @param year year of a date
9
+ * @returns number with the max number allowed. -1 if month does not exist in array list
10
+ */
11
+ export function getMonthMaxDayAllowed(month, year) {
12
+ if (month > 11 || month < 0)
13
+ return -1;
14
+ if (month === 1) {
15
+ // case for february
16
+ return isLeapYear(year) ? 29 : MONTH_MAX_DAYS[month];
17
+ }
18
+ else {
19
+ return MONTH_MAX_DAYS[month];
20
+ }
21
+ }
22
+ //# sourceMappingURL=getMonthMaxDayAllowed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getMonthMaxDayAllowed.js","sourceRoot":"","sources":["../../src/utils/getMonthMaxDayAllowed.ts"],"names":[],"mappings":"AAAA,SAAS,UAAU,CAAC,IAAY;IAC5B,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAExE;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,IAAY;IAC7D,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,CAAC,EAAE;QACb,oBAAoB;QACpB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;KACxD;SAAM;QACH,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;KAChC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { SyntaxNode } from '@lezer/common';
2
+ export declare function getNodeValue(str: string, node: SyntaxNode): string;
@@ -0,0 +1,9 @@
1
+ export function getNodeValue(str, node) {
2
+ if (!str || !node)
3
+ return '';
4
+ return sliceNodeValue(str, node);
5
+ }
6
+ function sliceNodeValue(str, { from, to }) {
7
+ return str.slice(from, to);
8
+ }
9
+ //# sourceMappingURL=getNodeValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getNodeValue.js","sourceRoot":"","sources":["../../src/utils/getNodeValue.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,IAAgB;IACtD,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,OAAO,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CACnB,GAAW,EACX,EAAE,IAAI,EAAE,EAAE,EAAgC;IAE1C,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC"}
@@ -1,4 +1,9 @@
1
- export declare function getNodeValue(str: string, { from, to }: {
2
- from: number;
3
- to: number;
4
- }): string;
1
+ export * from './getNodeValue';
2
+ export * from './customFunctions';
3
+ export * from './isNumberParam';
4
+ export * from './isPositiveNumberParam';
5
+ export * from './isStringParam';
6
+ export * from './isDateParam';
7
+ export * from './isValidDate';
8
+ export * from './getMonthMaxDayAllowed';
9
+ export declare const removeQuotes: (str: string) => string;
@@ -1,4 +1,10 @@
1
- export function getNodeValue(str, { from, to }) {
2
- return str.slice(from, to);
3
- }
1
+ export * from './getNodeValue';
2
+ export * from './customFunctions';
3
+ export * from './isNumberParam';
4
+ export * from './isPositiveNumberParam';
5
+ export * from './isStringParam';
6
+ export * from './isDateParam';
7
+ export * from './isValidDate';
8
+ export * from './getMonthMaxDayAllowed';
9
+ export const removeQuotes = (str) => str.replace(/'/g, '');
4
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CACxB,GAAW,EACX,EAAE,IAAI,EAAE,EAAE,EAAgC;IAE1C,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AAExC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ValidatorResponse } from '../constants/interfaces';
2
+ export declare function isDateParam(_param: any, dataType: string | undefined): ValidatorResponse;
@@ -0,0 +1,8 @@
1
+ import { ERROR_LIST, ERROR_DICTIONARY } from '../constants';
2
+ export function isDateParam(_param, dataType) {
3
+ const valid = dataType === 'date';
4
+ if (!valid)
5
+ return Object.assign({ valid }, ERROR_DICTIONARY[ERROR_LIST.missingDate]);
6
+ return { valid };
7
+ }
8
+ //# sourceMappingURL=isDateParam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isDateParam.js","sourceRoot":"","sources":["../../src/utils/isDateParam.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAG5D,MAAM,UAAU,WAAW,CACvB,MAAW,EACX,QAA4B;IAE5B,MAAM,KAAK,GAAG,QAAQ,KAAK,MAAM,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,uBAAS,KAAK,IAAK,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAG;IAC1E,OAAO,EAAE,KAAK,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ValidatorResponse } from '../constants/interfaces';
2
+ export declare function isNumberParam(param: any): ValidatorResponse;
@@ -0,0 +1,8 @@
1
+ import { ERROR_LIST, ERROR_DICTIONARY } from '../constants';
2
+ export function isNumberParam(param) {
3
+ const valid = typeof param === 'number';
4
+ if (!valid)
5
+ return Object.assign({ valid }, ERROR_DICTIONARY[ERROR_LIST.missingNumber]);
6
+ return { valid };
7
+ }
8
+ //# sourceMappingURL=isNumberParam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isNumberParam.js","sourceRoot":"","sources":["../../src/utils/isNumberParam.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAG5D,MAAM,UAAU,aAAa,CAAC,KAAU;IACpC,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,uBAAS,KAAK,IAAK,gBAAgB,CAAC,UAAU,CAAC,aAAa,CAAC,EAAG;IAC5E,OAAO,EAAE,KAAK,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ValidatorResponse } from '../constants/interfaces';
2
+ export declare function isPositiveNumberParam(param: any): ValidatorResponse;
@@ -0,0 +1,8 @@
1
+ import { ERROR_LIST, ERROR_DICTIONARY } from '../constants';
2
+ export function isPositiveNumberParam(param) {
3
+ const valid = param >= 0;
4
+ if (!valid)
5
+ return Object.assign({ valid }, ERROR_DICTIONARY[ERROR_LIST.greaterThanZero]);
6
+ return { valid };
7
+ }
8
+ //# sourceMappingURL=isPositiveNumberParam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isPositiveNumberParam.js","sourceRoot":"","sources":["../../src/utils/isPositiveNumberParam.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAG5D,MAAM,UAAU,qBAAqB,CAAC,KAAU;IAC5C,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK;QACN,uBAAS,KAAK,IAAK,gBAAgB,CAAC,UAAU,CAAC,eAAe,CAAC,EAAG;IACtE,OAAO,EAAE,KAAK,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ValidatorResponse } from '../constants/interfaces';
2
+ export declare function isStringParam(param: any): ValidatorResponse;
@@ -0,0 +1,8 @@
1
+ import { ERROR_LIST, ERROR_DICTIONARY } from '../constants';
2
+ export function isStringParam(param) {
3
+ const valid = typeof param === 'string';
4
+ if (!valid)
5
+ return Object.assign({ valid }, ERROR_DICTIONARY[ERROR_LIST.missingString]);
6
+ return { valid };
7
+ }
8
+ //# sourceMappingURL=isStringParam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isStringParam.js","sourceRoot":"","sources":["../../src/utils/isStringParam.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAG5D,MAAM,UAAU,aAAa,CAAC,KAAU;IACpC,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,uBAAS,KAAK,IAAK,gBAAgB,CAAC,UAAU,CAAC,aAAa,CAAC,EAAG;IAC5E,OAAO,EAAE,KAAK,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function isValidDate(d: unknown): boolean;
@@ -0,0 +1,4 @@
1
+ export function isValidDate(d) {
2
+ return !isNaN(d) && d instanceof Date;
3
+ }
4
+ //# sourceMappingURL=isValidDate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isValidDate.js","sourceRoot":"","sources":["../../src/utils/isValidDate.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,CAAU;IAClC,OAAO,CAAC,KAAK,CAAC,CAAW,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC;AACpD,CAAC"}
@@ -0,0 +1 @@
1
+ export { toDate } from './scripts';
@@ -0,0 +1,2 @@
1
+ export { toDate } from './scripts';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/sql/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { DateDifUnitParam } from '../../constants/interfaces';
2
+ export declare function toDate(value: string): string;
3
+ export declare function dateDif(start: string, end: string, unit: DateDifUnitParam): string;
@@ -0,0 +1,39 @@
1
+ function datePart(value, format) {
2
+ return `DATE_PART('${format}', ${value})`;
3
+ }
4
+ export function toDate(value) {
5
+ return `CAST('${value}' AS TIMESTAMPTZ)`;
6
+ }
7
+ function generalDateDif(start, end, unit) {
8
+ const units = {
9
+ Y: 'year',
10
+ M: 'month',
11
+ D: 'day',
12
+ };
13
+ const currentUnit = units[unit];
14
+ return `DATEDIFF('${currentUnit}', ${start}, ${end})`;
15
+ }
16
+ function customDateDifYear(start, end) {
17
+ const month = datePart('month', end);
18
+ const day = datePart('day', end);
19
+ const year = datePart('year', start);
20
+ const parts = [year, month, day].join(`|| '-' ||`);
21
+ const customDate = toDate(parts);
22
+ const dateDifToCompare = generalDateDif(start, customDate, 'D');
23
+ const dateDifYear = generalDateDif(start, end, 'Y');
24
+ const result = `CASE
25
+ WHEN ${dateDifToCompare} >= 0
26
+ THEN ${dateDifYear}
27
+ ELSE ${dateDifYear} - 1
28
+ END`;
29
+ return result;
30
+ }
31
+ export function dateDif(start, end, unit) {
32
+ const units = {
33
+ Y: customDateDifYear,
34
+ M: generalDateDif,
35
+ D: generalDateDif,
36
+ };
37
+ return units[unit](start, end, unit);
38
+ }
39
+ //# sourceMappingURL=scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../../src/utils/sql/scripts.ts"],"names":[],"mappings":"AAEA,SAAS,QAAQ,CAAC,KAAa,EAAE,MAAc;IAC3C,OAAO,cAAc,MAAM,MAAM,KAAK,GAAG,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAa;IAChC,OAAO,SAAS,KAAK,mBAAmB,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,GAAW,EAAE,IAAsB;IACtE,MAAM,KAAK,GAAG;QACV,CAAC,EAAE,MAAM;QACT,CAAC,EAAE,OAAO;QACV,CAAC,EAAE,KAAK;KACX,CAAC;IACF,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,aAAa,WAAW,MAAM,KAAK,KAAK,GAAG,GAAG,CAAC;AAC1D,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,GAAW;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG;eACJ,gBAAgB;mBACZ,WAAW;eACf,WAAW;QAClB,CAAC;IACL,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,GAAW,EAAE,IAAsB;IACtE,MAAM,KAAK,GAAG;QACV,CAAC,EAAE,iBAAiB;QACpB,CAAC,EAAE,cAAc;QACjB,CAAC,EAAE,cAAc;KACpB,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,17 +1,19 @@
1
1
  {
2
2
  "name": "@qrvey/formula-lang",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "QFormula support for qrvey projects",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "type": "module",
8
8
  "scripts": {
9
9
  "test": "jest __tests__",
10
+ "test:coverage": "jest __tests__ --collect-coverage",
10
11
  "build": "tsc",
11
12
  "build:watch": "tsc -w",
12
13
  "prepublishOnly": "npm run build",
13
14
  "cm": "cz",
14
15
  "prepare-lang": "rollup -c --bundleConfigAsCjs",
16
+ "corp-release": "corp-semantic-release -v --branch release/publish",
15
17
  "lint": "eslint src --ext .ts",
16
18
  "lint:fix": "eslint src --fix --ext .ts",
17
19
  "prettier:fix": "prettier --write ./src",
@@ -42,6 +44,7 @@
42
44
  "@typescript-eslint/eslint-plugin": "^5.58.0",
43
45
  "@typescript-eslint/parser": "^5.58.0",
44
46
  "commitizen": "^4.3.0",
47
+ "corp-semantic-release": "^7.0.0",
45
48
  "cz-conventional-changelog": "^3.3.0",
46
49
  "eslint": "^8.38.0",
47
50
  "eslint-config-prettier": "^8.8.0",
@@ -0,0 +1,42 @@
1
+ export declare enum ENGINES {
2
+ ELASTICSEARCH = "elasticsearch",
3
+ SNOWFLAKE = "snowflake",
4
+ REDSHIFT = "redshift"
5
+ }
6
+ export declare enum AST_TYPES {
7
+ program = "Program",
8
+ binaryExpression = "BinaryExpression",
9
+ unaryExpression = "UnaryExpression",
10
+ functionCall = "FunctionCall",
11
+ variable = "Variable",
12
+ literal = "Literal"
13
+ }
14
+ export declare enum ERROR_LIST {
15
+ arguments = "arguments",
16
+ nulls = "nulls",
17
+ floatingPoint = "floatingPoint",
18
+ missingString = "missingString",
19
+ missingNumber = "missingNumber",
20
+ missingDate = "missingDate",
21
+ greaterThanZero = "greaterThanZero",
22
+ missingArg = "missingArg",
23
+ unknownFunction = "unknownFunction",
24
+ unknown = "unknown",
25
+ customDateDifParams = "customDateDifParams",
26
+ tooManyArguments = "tooManyArguments"
27
+ }
28
+ type iErrorsType = {
29
+ [key in ERROR_LIST]: IErrorDictionary;
30
+ };
31
+ interface IErrorDictionary {
32
+ message: string;
33
+ code: string;
34
+ }
35
+ export declare const ERROR_DICTIONARY: iErrorsType;
36
+ export type CustomEngineOperators = {
37
+ [key in ENGINES]?: {
38
+ [T: string]: string;
39
+ };
40
+ };
41
+ export declare const CustomOperators: CustomEngineOperators;
42
+ export {};