dsl-to-sql 1.0.0-fabric-1p-development.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/.turbo/turbo-build.log +9 -0
  2. package/.turbo/turbo-check-types.log +4 -0
  3. package/.turbo/turbo-lint.log +126 -0
  4. package/README.md +45 -0
  5. package/coverage/base.css +224 -0
  6. package/coverage/block-navigation.js +87 -0
  7. package/coverage/favicon.png +0 -0
  8. package/coverage/index.html +236 -0
  9. package/coverage/prettify.css +1 -0
  10. package/coverage/prettify.js +2 -0
  11. package/coverage/sort-arrow-sprite.png +0 -0
  12. package/coverage/sorter.js +210 -0
  13. package/coverage/src/constants.ts.html +826 -0
  14. package/coverage/src/database_types.ts.html +136 -0
  15. package/coverage/src/epm-query-builder/EpmQueryBuilder.ts.html +166 -0
  16. package/coverage/src/epm-query-builder/base/BaseAdvancedAggregations.ts.html +568 -0
  17. package/coverage/src/epm-query-builder/base/BaseAnalyticalFunctions.ts.html +694 -0
  18. package/coverage/src/epm-query-builder/base/BaseCTEGenerator.ts.html +1459 -0
  19. package/coverage/src/epm-query-builder/base/BaseCountQueryBuilder.ts.html +400 -0
  20. package/coverage/src/epm-query-builder/base/BaseMeasureBuilder.ts.html +295 -0
  21. package/coverage/src/epm-query-builder/base/BaseOrderBuilder.ts.html +670 -0
  22. package/coverage/src/epm-query-builder/base/BasePaginationBuilder.ts.html +364 -0
  23. package/coverage/src/epm-query-builder/base/BaseQueryBuilder.ts.html +238 -0
  24. package/coverage/src/epm-query-builder/base/BaseRollupBuilder.ts.html +532 -0
  25. package/coverage/src/epm-query-builder/base/BaseSqlBuilder.ts.html +601 -0
  26. package/coverage/src/epm-query-builder/base/BaseSuperFilterBuilder.ts.html +1966 -0
  27. package/coverage/src/epm-query-builder/base/BaseUtilities.ts.html +1798 -0
  28. package/coverage/src/epm-query-builder/base/ColumnRefUtils.ts.html +211 -0
  29. package/coverage/src/epm-query-builder/base/RelationshipResolver.ts.html +706 -0
  30. package/coverage/src/epm-query-builder/base/SharedFilterBuilder.ts.html +1717 -0
  31. package/coverage/src/epm-query-builder/base/index.html +326 -0
  32. package/coverage/src/epm-query-builder/constants/Aggregations.ts.html +133 -0
  33. package/coverage/src/epm-query-builder/constants/Database.ts.html +103 -0
  34. package/coverage/src/epm-query-builder/constants/Source.ts.html +106 -0
  35. package/coverage/src/epm-query-builder/constants/index.html +146 -0
  36. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbAdvancedAggregations.ts.html +286 -0
  37. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbJoinBuilder.ts.html +280 -0
  38. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbMeasureBuilder.ts.html +1924 -0
  39. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbOrderBuilder.ts.html +769 -0
  40. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbPaginationBuilder.ts.html +643 -0
  41. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbQueryBuilder.ts.html +2644 -0
  42. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbRollupBuilder.ts.html +478 -0
  43. package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbSuperFilterBuilder.ts.html +1195 -0
  44. package/coverage/src/epm-query-builder/dialects/duckdb/index.html +221 -0
  45. package/coverage/src/epm-query-builder/errors/QueryBuilderErrors.ts.html +280 -0
  46. package/coverage/src/epm-query-builder/errors/index.html +116 -0
  47. package/coverage/src/epm-query-builder/index.html +116 -0
  48. package/coverage/src/epm-query-builder/interfaces/IDatabaseQueryBuilder.ts.html +100 -0
  49. package/coverage/src/epm-query-builder/interfaces/index.html +131 -0
  50. package/coverage/src/epm-query-builder/interfaces/index.ts.html +88 -0
  51. package/coverage/src/epm-query-builder/utils/format.ts.html +151 -0
  52. package/coverage/src/epm-query-builder/utils/index.html +146 -0
  53. package/coverage/src/epm-query-builder/utils/sql.ts.html +247 -0
  54. package/coverage/src/epm-query-builder/utils/validation.ts.html +124 -0
  55. package/coverage/src/epm-query-builder/validation/QueryOptionsValidator.ts.html +631 -0
  56. package/coverage/src/epm-query-builder/validation/SqlQueryValidator.ts.html +475 -0
  57. package/coverage/src/epm-query-builder/validation/index.html +131 -0
  58. package/coverage/src/filters/FilterConditionBuilder.ts.html +427 -0
  59. package/coverage/src/filters/filter-types.ts.html +484 -0
  60. package/coverage/src/filters/index.html +131 -0
  61. package/coverage/src/index.html +176 -0
  62. package/coverage/src/index.ts.html +103 -0
  63. package/coverage/src/js-lib/JsToSqlParser.ts.html +736 -0
  64. package/coverage/src/js-lib/ParseContext.ts.html +532 -0
  65. package/coverage/src/js-lib/db/azuresql/AzureSqlCallExpressionVisitor.ts.html +196 -0
  66. package/coverage/src/js-lib/db/azuresql/index.html +116 -0
  67. package/coverage/src/js-lib/db/base/ArrayExpressionVisitor.ts.html +133 -0
  68. package/coverage/src/js-lib/db/base/AssignmentExpressionVisitor.ts.html +187 -0
  69. package/coverage/src/js-lib/db/base/BinaryExpressionVisitor.ts.html +223 -0
  70. package/coverage/src/js-lib/db/base/CallExpressionVisitor.ts.html +5479 -0
  71. package/coverage/src/js-lib/db/base/IdentifierVisitor.ts.html +283 -0
  72. package/coverage/src/js-lib/db/base/LiteralVisitor.ts.html +199 -0
  73. package/coverage/src/js-lib/db/base/MemberExpressionVisitor.ts.html +193 -0
  74. package/coverage/src/js-lib/db/base/ProgramVisitor.ts.html +139 -0
  75. package/coverage/src/js-lib/db/base/UnaryExpressionVisitor.ts.html +181 -0
  76. package/coverage/src/js-lib/db/base/VisitorInterface.ts.html +103 -0
  77. package/coverage/src/js-lib/db/base/index.html +251 -0
  78. package/coverage/src/js-lib/db/bigquery/BigQueryCallExpressionVisitor.ts.html +1747 -0
  79. package/coverage/src/js-lib/db/bigquery/index.html +116 -0
  80. package/coverage/src/js-lib/db/commonTransforms.ts.html +2074 -0
  81. package/coverage/src/js-lib/db/databricks/DatabricksCallExpressionVisitor.ts.html +1303 -0
  82. package/coverage/src/js-lib/db/databricks/index.html +116 -0
  83. package/coverage/src/js-lib/db/fabricsql/FabricSqlCallExpressionVisitor.ts.html +196 -0
  84. package/coverage/src/js-lib/db/fabricsql/index.html +116 -0
  85. package/coverage/src/js-lib/db/fabricwarehouse/FabricWarehouseCallExpressionVisitor.ts.html +292 -0
  86. package/coverage/src/js-lib/db/fabricwarehouse/index.html +116 -0
  87. package/coverage/src/js-lib/db/index.html +116 -0
  88. package/coverage/src/js-lib/db/postgresql/PostgreSqlCallExpressionVisitor.ts.html +985 -0
  89. package/coverage/src/js-lib/db/postgresql/index.html +116 -0
  90. package/coverage/src/js-lib/db/redshift/RedshiftCallExpressionVisitor.ts.html +685 -0
  91. package/coverage/src/js-lib/db/redshift/index.html +116 -0
  92. package/coverage/src/js-lib/db/sample/SampleCallExpressionVisitor.ts.html +196 -0
  93. package/coverage/src/js-lib/db/sample/index.html +116 -0
  94. package/coverage/src/js-lib/db/snowflake/SnowflakeCallExpressionVisitor.ts.html +1447 -0
  95. package/coverage/src/js-lib/db/snowflake/index.html +116 -0
  96. package/coverage/src/js-lib/db/validator/FormulaValidator.ts.html +4162 -0
  97. package/coverage/src/js-lib/db/validator/index.html +116 -0
  98. package/coverage/src/js-lib/index.html +131 -0
  99. package/coverage/src/js-lib/objects/BaseObject.ts.html +169 -0
  100. package/coverage/src/js-lib/objects/DateObject.ts.html +169 -0
  101. package/coverage/src/js-lib/objects/PctObject.ts.html +178 -0
  102. package/coverage/src/js-lib/objects/index.html +146 -0
  103. package/coverage/src/query-builder/PaginationBuilder.ts.html +142 -0
  104. package/coverage/src/query-builder/QueryBuilder.ts.html +3118 -0
  105. package/coverage/src/query-builder/SuperFilterBuilder.ts.html +1969 -0
  106. package/coverage/src/query-builder/index.html +146 -0
  107. package/coverage/src/runtime_var.ts.html +109 -0
  108. package/coverage/src/sql-lib/binary_expr.ts.html +133 -0
  109. package/coverage/src/sql-lib/case.ts.html +133 -0
  110. package/coverage/src/sql-lib/column.ts.html +139 -0
  111. package/coverage/src/sql-lib/else.ts.html +124 -0
  112. package/coverage/src/sql-lib/function.ts.html +112 -0
  113. package/coverage/src/sql-lib/index.html +251 -0
  114. package/coverage/src/sql-lib/join.ts.html +127 -0
  115. package/coverage/src/sql-lib/literal.ts.html +130 -0
  116. package/coverage/src/sql-lib/select.ts.html +547 -0
  117. package/coverage/src/sql-lib/unary_expr.ts.html +112 -0
  118. package/coverage/src/sql-lib/when.ts.html +130 -0
  119. package/coverage/src/sql_query_gen.ts.html +535 -0
  120. package/coverage/src/superFilter/DateFilterFactory.ts.html +625 -0
  121. package/coverage/src/superFilter/dateFunction.ts.html +193 -0
  122. package/coverage/src/superFilter/index.html +131 -0
  123. package/coverage/src/utils.ts.html +571 -0
  124. package/dist/index.cjs +8440 -0
  125. package/dist/index.d.cts +927 -0
  126. package/dist/index.d.cts.map +1 -0
  127. package/dist/index.d.ts +927 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +8387 -0
  130. package/dist/index.js.map +1 -0
  131. package/eslint.config.js +4 -0
  132. package/jest.config.ts +44 -0
  133. package/package.json +45 -0
  134. package/src/constants.ts +247 -0
  135. package/src/epm-query-builder/EpmQueryBuilder.ts +27 -0
  136. package/src/epm-query-builder/base/BaseAdvancedAggregations.ts +161 -0
  137. package/src/epm-query-builder/base/BaseAnalyticalFunctions.ts +203 -0
  138. package/src/epm-query-builder/base/BaseCTEGenerator.ts +458 -0
  139. package/src/epm-query-builder/base/BaseCountQueryBuilder.ts +105 -0
  140. package/src/epm-query-builder/base/BaseMeasureBuilder.ts +87 -0
  141. package/src/epm-query-builder/base/BaseOrderBuilder.ts +195 -0
  142. package/src/epm-query-builder/base/BasePaginationBuilder.ts +93 -0
  143. package/src/epm-query-builder/base/BaseQueryBuilder.ts +51 -0
  144. package/src/epm-query-builder/base/BaseRollupBuilder.ts +149 -0
  145. package/src/epm-query-builder/base/BaseSqlBuilder.ts +172 -0
  146. package/src/epm-query-builder/base/BaseSuperFilterBuilder.ts +627 -0
  147. package/src/epm-query-builder/base/BaseUtilities.ts +571 -0
  148. package/src/epm-query-builder/base/ColumnRefUtils.ts +42 -0
  149. package/src/epm-query-builder/base/RelationshipResolver.ts +207 -0
  150. package/src/epm-query-builder/base/SharedFilterBuilder.ts +544 -0
  151. package/src/epm-query-builder/constants/Aggregations.ts +16 -0
  152. package/src/epm-query-builder/constants/Database.ts +6 -0
  153. package/src/epm-query-builder/constants/Source.ts +7 -0
  154. package/src/epm-query-builder/dialects/duckdb/DuckDbAdvancedAggregations.ts +67 -0
  155. package/src/epm-query-builder/dialects/duckdb/DuckDbJoinBuilder.ts +65 -0
  156. package/src/epm-query-builder/dialects/duckdb/DuckDbMeasureBuilder.ts +626 -0
  157. package/src/epm-query-builder/dialects/duckdb/DuckDbOrderBuilder.ts +228 -0
  158. package/src/epm-query-builder/dialects/duckdb/DuckDbPaginationBuilder.ts +186 -0
  159. package/src/epm-query-builder/dialects/duckdb/DuckDbQueryBuilder.ts +853 -0
  160. package/src/epm-query-builder/dialects/duckdb/DuckDbRollupBuilder.ts +131 -0
  161. package/src/epm-query-builder/dialects/duckdb/DuckDbSuperFilterBuilder.ts +370 -0
  162. package/src/epm-query-builder/errors/QueryBuilderErrors.ts +65 -0
  163. package/src/epm-query-builder/interfaces/IDatabaseQueryBuilder.ts +5 -0
  164. package/src/epm-query-builder/interfaces/index.ts +1 -0
  165. package/src/epm-query-builder/types/query-builder-types.d.ts +289 -0
  166. package/src/epm-query-builder/utils/format.ts +22 -0
  167. package/src/epm-query-builder/utils/sql.ts +54 -0
  168. package/src/epm-query-builder/utils/validation.ts +13 -0
  169. package/src/epm-query-builder/validation/QueryOptionsValidator.ts +182 -0
  170. package/src/epm-query-builder/validation/SqlQueryValidator.ts +130 -0
  171. package/src/filters/FilterConditionBuilder.ts +114 -0
  172. package/src/filters/filter-types.ts +133 -0
  173. package/src/index.ts +10 -0
  174. package/src/js-lib/JsToSqlParser.ts +217 -0
  175. package/src/js-lib/ParseContext.ts +149 -0
  176. package/src/js-lib/db/base/ArrayExpressionVisitor.ts +16 -0
  177. package/src/js-lib/db/base/AssignmentExpressionVisitor.ts +34 -0
  178. package/src/js-lib/db/base/BinaryExpressionVisitor.ts +46 -0
  179. package/src/js-lib/db/base/CallExpressionVisitor.ts +1798 -0
  180. package/src/js-lib/db/base/IdentifierVisitor.ts +66 -0
  181. package/src/js-lib/db/base/LiteralVisitor.ts +38 -0
  182. package/src/js-lib/db/base/MemberExpressionVisitor.ts +36 -0
  183. package/src/js-lib/db/base/ProgramVisitor.ts +18 -0
  184. package/src/js-lib/db/base/UnaryExpressionVisitor.ts +32 -0
  185. package/src/js-lib/db/base/VisitorInterface.ts +6 -0
  186. package/src/js-lib/db/validator/FormulaValidator.ts +1235 -0
  187. package/src/js-lib/objects/BaseObject.ts +28 -0
  188. package/src/js-lib/objects/DateObject.ts +28 -0
  189. package/src/js-lib/objects/PctObject.ts +31 -0
  190. package/src/query-builder/PaginationBuilder.ts +19 -0
  191. package/src/query-builder/QueryBuilder.ts +1035 -0
  192. package/src/query-builder/SuperFilterBuilder.ts +628 -0
  193. package/src/runtime_var.ts +8 -0
  194. package/src/sql-lib/binary_expr.ts +16 -0
  195. package/src/sql-lib/case.ts +16 -0
  196. package/src/sql-lib/column.ts +18 -0
  197. package/src/sql-lib/else.ts +13 -0
  198. package/src/sql-lib/function.ts +9 -0
  199. package/src/sql-lib/join.ts +14 -0
  200. package/src/sql-lib/literal.ts +15 -0
  201. package/src/sql-lib/select.ts +154 -0
  202. package/src/sql-lib/unary_expr.ts +9 -0
  203. package/src/sql-lib/when.ts +15 -0
  204. package/src/sql-types.d.ts +565 -0
  205. package/src/sql_query_gen.ts +150 -0
  206. package/src/superFilter/DateFilterFactory.ts +180 -0
  207. package/src/superFilter/dateFunction.ts +36 -0
  208. package/src/utils.ts +354 -0
  209. package/test-output/report/junit.xml +329 -0
  210. package/tests/JsToSqlParser.test.ts +163 -0
  211. package/tests/QueryBuilder.test.ts +1320 -0
  212. package/tests/js-lib/CallExpressionVisitor.test.ts +820 -0
  213. package/tests/mocks/MockQueryResolver.ts +14 -0
  214. package/tests/sanity.test.ts +146 -0
  215. package/tests/sql-lib/binary_expr.test.ts +75 -0
  216. package/tests/sql-lib/case.test.ts +117 -0
  217. package/tests/sql-lib/column.test.ts +87 -0
  218. package/tests/sql-lib/else.test.ts +56 -0
  219. package/tests/sql-lib/function.test.ts +96 -0
  220. package/tests/sql-lib/literal.test.ts +75 -0
  221. package/tests/sql-lib/select.test.ts +245 -0
  222. package/tests/sql-lib/unary_expr.test.ts +32 -0
  223. package/tests/utils.test.ts +13 -0
  224. package/tsconfig.json +24 -0
  225. package/tsdown.config.ts +23 -0
@@ -0,0 +1,66 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+
3
+ import { VisitorInterface } from './VisitorInterface';
4
+ import * as acorn from 'acorn';
5
+ import { ParseContext } from '../../ParseContext';
6
+ import { toValue, DataType } from '../../../sql-lib/literal';
7
+ import { toColumnRef } from '../../../sql-lib/column';
8
+ import { ExpressionValue } from '../../../sql-types';
9
+ import {
10
+ RUNTIME_LOGGEDIN_EMAIL,
11
+ RUNTIME_LOGGEDIN_NAME,
12
+ RUNTIME_CURRENT_DATE,
13
+ RUNTIME_CURRENT_DATETIME,
14
+ } from '../../../runtime_var';
15
+ import { getArgType } from '@/utils';
16
+
17
+ const StaticIdentifierMap = new Map<string, (context: ParseContext) => ExpressionValue>([
18
+ ['COLUMN_COUNT', (context: ParseContext) => toValue(DataType.NUMBER, context.getColumnCount())],
19
+ ['BLANK', (context: ParseContext) => toValue(DataType.NULL, null)],
20
+ ['TRUE', (context: ParseContext) => toValue(DataType.BOOLEAN, true)],
21
+ ['FALSE', (context: ParseContext) => toValue(DataType.BOOLEAN, false)],
22
+ ['LOGGEDIN_EMAIL', (context: ParseContext) => toValue(DataType.STRING, RUNTIME_LOGGEDIN_EMAIL)],
23
+ ['LOGGEDIN_NAME', (context: ParseContext) => toValue(DataType.STRING, RUNTIME_LOGGEDIN_NAME)],
24
+ ['CURRENT_DATE', (context: ParseContext) => toValue(DataType.STRING, RUNTIME_CURRENT_DATE)],
25
+ [
26
+ 'CURRENT_DATETIME',
27
+ (context: ParseContext) => toValue(DataType.STRING, RUNTIME_CURRENT_DATETIME),
28
+ ],
29
+ ]);
30
+
31
+ export class IdentifierVisitor implements VisitorInterface<acorn.Identifier> {
32
+ /**
33
+ * visitor needs to be implemented as arrow function to avoid `this` binding issue since it will be
34
+ * passed to `acorn-walk` library
35
+ */
36
+ public visitor = (node: acorn.Identifier, context: ParseContext) => {
37
+ try {
38
+ const nameInUpperCase = node.name.toUpperCase();
39
+
40
+ if (StaticIdentifierMap.has(nameInUpperCase)) {
41
+ context.set(node, StaticIdentifierMap.get(nameInUpperCase)!(context));
42
+ } else if (
43
+ context.formulaIdColumnMap[node.name] ||
44
+ context.deprecatedFormulaColumnMap[node.name]
45
+ ) {
46
+ const columnName =
47
+ context.formulaIdColumnMap[node.name] || context.deprecatedFormulaColumnMap[node.name];
48
+ const formattedColumnName = context.entityNameFormatter(columnName);
49
+ context.set(node, toColumnRef(formattedColumnName));
50
+ context.addColumnDep(columnName);
51
+ // Validating the identifier and setting the return type
52
+ const returnType = getArgType(toColumnRef(formattedColumnName), context);
53
+ Object.assign(context, {
54
+ returnType,
55
+ isValid: true,
56
+ error: undefined,
57
+ });
58
+ }
59
+ } catch (error) {
60
+ Object.assign(context, {
61
+ isValid: false,
62
+ error: error,
63
+ });
64
+ }
65
+ };
66
+ }
@@ -0,0 +1,38 @@
1
+ import { VisitorInterface } from './VisitorInterface';
2
+ import * as acorn from 'acorn';
3
+ import { ParseContext } from '../../ParseContext';
4
+ import { DataType, toValue } from '../../../sql-lib/literal';
5
+ import { getArgType } from '@/utils';
6
+
7
+ export class LiteralVisitor implements VisitorInterface<acorn.Literal> {
8
+ /**
9
+ * visitor needs to be implemented as arrow function to avoid `this` binding issue since it will be
10
+ * passed to `acorn-walk` library
11
+ */
12
+ public visitor = (node: acorn.Literal, context: ParseContext) => {
13
+ try {
14
+ const value = node.value;
15
+ const literalNode = toValue(getDataType(value), value);
16
+ context.set(node, literalNode);
17
+
18
+ // Validating the Literal and setting the return type
19
+ const returnType = getArgType(literalNode, context);
20
+ Object.assign(context, { returnType, isValid: true, error: undefined });
21
+ } catch (error) {
22
+ Object.assign(context, { isValid: false, error });
23
+ }
24
+ };
25
+ }
26
+
27
+ function getDataType(value: unknown): DataType {
28
+ switch (typeof value) {
29
+ case 'number':
30
+ return DataType.NUMBER;
31
+ case 'string':
32
+ return DataType.STRING;
33
+ case 'boolean':
34
+ return DataType.BOOLEAN;
35
+ default:
36
+ return DataType.NULL;
37
+ }
38
+ }
@@ -0,0 +1,36 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+
3
+ import { VisitorInterface } from './VisitorInterface';
4
+ import * as acorn from 'acorn';
5
+ import { ParseContext } from '../../ParseContext';
6
+ import { BaseObject } from '../../objects/BaseObject';
7
+ import { DateObject } from '../../objects/DateObject';
8
+
9
+ const OBJECT_MAP = new Map<string, (context: ParseContext) => BaseObject>([
10
+ ['DATE', (context: ParseContext) => new DateObject()],
11
+ ]);
12
+
13
+ export class MemberExpressionVisitor implements VisitorInterface<acorn.MemberExpression> {
14
+ /**
15
+ * visitor needs to be implemented as arrow function to avoid `this` binding issue since it will be
16
+ * passed to `acorn-walk` library
17
+ */
18
+ public visitor = (node: acorn.MemberExpression, context: ParseContext) => {
19
+ const objectName = (node.object as acorn.Identifier).name.toUpperCase();
20
+ const property = (node.property as acorn.Identifier).name.toUpperCase();
21
+ const object = OBJECT_MAP.get(objectName)?.(context);
22
+ if (!object) {
23
+ throw new Error(`Unsupported object: ${objectName}`);
24
+ }
25
+
26
+ context.set(node, object);
27
+ const isFn = object.fnMap.has(property);
28
+ const isProp = !isFn && object.propertyMap.has(property);
29
+ if (!isFn && !isProp) {
30
+ throw new Error(`Unsupported property: ${property}`);
31
+ } else if (isProp) {
32
+ context.set(node, object.propertyMap.get(property)?.(context));
33
+ }
34
+ // otherwise ignore. It will be resolved later in call expression
35
+ };
36
+ }
@@ -0,0 +1,18 @@
1
+ import { VisitorInterface } from './VisitorInterface';
2
+ import * as acorn from 'acorn';
3
+ import { ParseContext } from '../../ParseContext';
4
+ import { BaseObject } from '../../objects/BaseObject';
5
+
6
+ export class ProgramVisitor implements VisitorInterface<acorn.Program> {
7
+ /**
8
+ * visitor needs to be implemented as arrow function to avoid `this` binding issue since it will be
9
+ * passed to `acorn-walk` library
10
+ */
11
+ public visitor = (node: acorn.Program, context: ParseContext) => {
12
+ let result = context.get(node.body[node.body.length - 1]);
13
+ if (result instanceof BaseObject) {
14
+ result = result.resolve();
15
+ }
16
+ context.set(node, result);
17
+ };
18
+ }
@@ -0,0 +1,32 @@
1
+ import { VisitorInterface } from './VisitorInterface';
2
+ import * as acorn from 'acorn';
3
+ import { ParseContext } from '../../ParseContext';
4
+ import { ExpressionValue, Value } from '../../../sql-types';
5
+
6
+ export class UnaryExpressionVisitor implements VisitorInterface<acorn.UnaryExpression> {
7
+ /**
8
+ * visitor needs to be implemented as arrow function to avoid `this` binding issue since it will be
9
+ * passed to `acorn-walk` library
10
+ */
11
+ public visitor = (node: acorn.UnaryExpression, context: ParseContext) => {
12
+ const expr = context.get(node.argument);
13
+ const op = node.operator;
14
+ if (node.argument.type === 'Literal') {
15
+ context.set(node, resolveLiteral(op, expr as Value));
16
+ return;
17
+ }
18
+
19
+ throw new Error(`Unsupported unary operator: ${op}`);
20
+ };
21
+ }
22
+
23
+ function resolveLiteral(op: string, arg: Value): ExpressionValue {
24
+ switch (op) {
25
+ case '-':
26
+ return { type: 'number', value: -arg.value };
27
+ case '+':
28
+ return arg;
29
+ default:
30
+ throw new Error(`Unsupported unary operator: ${op}`);
31
+ }
32
+ }
@@ -0,0 +1,6 @@
1
+ import { ParseContext } from '../../ParseContext';
2
+ import * as acorn from 'acorn';
3
+ export type Node = acorn.Node;
4
+ export interface VisitorInterface<T extends Node> {
5
+ visitor: (node: T, context: ParseContext) => void;
6
+ }