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,4 @@
1
+ import { config } from "@repo/eslint-config";
2
+
3
+ /** @type {import("eslint").Linter.Config} */
4
+ export default config;
package/jest.config.ts ADDED
@@ -0,0 +1,44 @@
1
+ import type { Config } from 'jest';
2
+
3
+ const config: Config = {
4
+ verbose: true,
5
+ roots: ['<rootDir>/src', '<rootDir>/tests'],
6
+ testMatch: ['**/?(*.)+(spec|test).+(ts|tsx|js)'],
7
+ transform: {
8
+ '^.+\\.(ts|tsx)$': [
9
+ 'ts-jest',
10
+ {
11
+ useESM: true,
12
+ tsconfig: 'tsconfig.json',
13
+ diagnostics: {
14
+ exclude: ['**'],
15
+ },
16
+ },
17
+ ],
18
+ },
19
+ moduleNameMapper: {
20
+ '^(\\.{1,2}/.*)\\.js$': '$1',
21
+ },
22
+ moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx'],
23
+ testEnvironment: 'node',
24
+ reporters: [
25
+ 'default',
26
+ [
27
+ 'jest-junit',
28
+ {
29
+ outputDirectory: '<rootDir>/test-output/report',
30
+ outputName: 'junit.xml',
31
+ suiteName: 'DSL to SQL Tests',
32
+ },
33
+ ],
34
+ ],
35
+ testTimeout: 30000,
36
+ displayName: 'DSL to SQL: Unit Tests',
37
+ collectCoverage: true,
38
+ collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}', '!**/*.d.ts'],
39
+ coverageDirectory: 'coverage',
40
+ coverageReporters: ['html', 'text'],
41
+ extensionsToTreatAsEsm: ['.ts'],
42
+ };
43
+
44
+ export default config;
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "dsl-to-sql",
3
+ "version": "1.0.0-fabric-1p-development.1",
4
+ "description": "Converts DSL formulas to SQL queries",
5
+ "type": "module",
6
+ "private": false,
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsdown",
19
+ "check-types": "tsc --noEmit",
20
+ "lint": "eslint src/ --max-warnings 2337",
21
+ "test": "jest --detectOpenHandles"
22
+ },
23
+ "author": "Lumel",
24
+ "license": "MIT",
25
+ "devDependencies": {
26
+ "@jest/globals": "^29.7.0",
27
+ "@repo/eslint-config": "workspace:*",
28
+ "@repo/jest-presets": "workspace:*",
29
+ "@repo/typescript-config": "workspace:*",
30
+ "@types/jest": "^29.5.0",
31
+ "@types/node": "^22.16.0",
32
+ "eslint": "^9.31.0",
33
+ "jest": "^29.7.0",
34
+ "jest-junit": "^16.0.0",
35
+ "node-sql-parser": "^5.3.13",
36
+ "ts-jest": "^29.1.0",
37
+ "tsdown": "^0.15.4",
38
+ "typescript": "^5.8.2"
39
+ },
40
+ "dependencies": {
41
+ "acorn": "^8.15.0",
42
+ "acorn-walk": "^8.3.4",
43
+ "xxhashjs": "^0.2.2"
44
+ }
45
+ }
@@ -0,0 +1,247 @@
1
+ // Column Types
2
+ export enum ECustomColumnType {
3
+ TEXT = 1,
4
+ SINGLE_SELECT = 2,
5
+ MULTI_SELECT = 3,
6
+ DATE = 4,
7
+ COMMENTS = 5,
8
+ NUMBER = 6,
9
+ PERSON = 7,
10
+ TIME = 8,
11
+ LAST_UPDATED_BY = 9,
12
+ LAST_UPDATED_AT = 10,
13
+ CHECKBOX = 11,
14
+ DATETIME = 12,
15
+ DECIMAL = 13,
16
+ IMAGE = 14,
17
+ URL = 15,
18
+ EMAIL = 16,
19
+ FORMULA = 17,
20
+ BUTTON_COLUMN = 18,
21
+ CURRENCY = 19,
22
+ PHONE_NUMBER = 20,
23
+ RATING = 21,
24
+ ATTACHMENT = 22,
25
+ PERCENT_SLIDER = 23,
26
+ PERCENT = 24,
27
+ }
28
+
29
+ export enum EDataType {
30
+ STRING = 'string',
31
+ NUMBER = 'number',
32
+ DATE = 'date',
33
+ BOOLEAN = 'boolean',
34
+ NULL = 'null',
35
+ }
36
+
37
+ export type NullableValueType = EDataType | null;
38
+
39
+ // Column Type - Value Type Mapping
40
+ export const COLUMN_TYPE_TO_STRING: Record<ECustomColumnType, NullableValueType> = {
41
+ [ECustomColumnType.TEXT]: EDataType.STRING,
42
+ [ECustomColumnType.SINGLE_SELECT]: EDataType.STRING,
43
+ [ECustomColumnType.MULTI_SELECT]: EDataType.STRING,
44
+ [ECustomColumnType.COMMENTS]: EDataType.STRING,
45
+ [ECustomColumnType.URL]: EDataType.STRING,
46
+ [ECustomColumnType.EMAIL]: EDataType.STRING,
47
+ [ECustomColumnType.PERSON]: EDataType.STRING,
48
+ [ECustomColumnType.IMAGE]: EDataType.STRING,
49
+ [ECustomColumnType.ATTACHMENT]: EDataType.STRING,
50
+
51
+ [ECustomColumnType.NUMBER]: EDataType.NUMBER,
52
+ [ECustomColumnType.DECIMAL]: EDataType.NUMBER,
53
+ [ECustomColumnType.CURRENCY]: EDataType.NUMBER,
54
+ [ECustomColumnType.RATING]: EDataType.NUMBER,
55
+ [ECustomColumnType.PERCENT]: EDataType.NUMBER,
56
+ [ECustomColumnType.PERCENT_SLIDER]: EDataType.NUMBER,
57
+
58
+ [ECustomColumnType.DATE]: EDataType.DATE,
59
+ [ECustomColumnType.TIME]: EDataType.DATE,
60
+ [ECustomColumnType.DATETIME]: EDataType.DATE,
61
+ [ECustomColumnType.LAST_UPDATED_AT]: EDataType.DATE,
62
+
63
+ [ECustomColumnType.CHECKBOX]: EDataType.BOOLEAN,
64
+
65
+ // Null types
66
+ [ECustomColumnType.LAST_UPDATED_BY]: null,
67
+ [ECustomColumnType.FORMULA]: null,
68
+ [ECustomColumnType.BUTTON_COLUMN]: null,
69
+ [ECustomColumnType.PHONE_NUMBER]: null,
70
+ };
71
+
72
+ // Operators
73
+ export const MATH_OPERATORS = new Set(['+', '-', '*', '/', '%']);
74
+ export const COMPARISON_OPERATORS = new Set(['=', '==', '<', '<=', '>', '>=', '!=', '<>']);
75
+ export const OPERATOR_MAP = new Map([['==', '=']]);
76
+
77
+ // Date/Time functions
78
+ const DATE_FUNCTIONS = [
79
+ 'TODAY',
80
+ 'CURRENT_DATE',
81
+ 'GETDATE',
82
+ 'CURRENT_TIMESTAMP',
83
+ 'NOW',
84
+ 'SYSDATE',
85
+ 'DATEADD',
86
+ 'DATEDIFF',
87
+ 'EOMONTH',
88
+ 'DATE',
89
+ 'FROMEXCELDATE',
90
+ ] as const;
91
+
92
+ // Numeric functions
93
+ const NUMERIC_FUNCTIONS = [
94
+ 'YEAR',
95
+ 'MONTH',
96
+ 'DAY',
97
+ 'HOUR',
98
+ 'MINUTE',
99
+ 'SECOND',
100
+ 'DATEDIFF_DAY',
101
+ 'DATEDIFF_MONTH',
102
+ 'DATEDIFF_YEAR',
103
+ 'ABS',
104
+ 'CEIL',
105
+ 'CEILING',
106
+ 'FLOOR',
107
+ 'ROUND',
108
+ 'RAND',
109
+ 'RANDBETWEEN',
110
+ 'POW',
111
+ 'POWER',
112
+ 'SQRT',
113
+ 'LOG',
114
+ 'LN',
115
+ 'EXP',
116
+ 'MOD',
117
+ 'ODD',
118
+ 'EVEN',
119
+ 'NUMBERVALUE',
120
+ 'VALUE',
121
+ 'LEN',
122
+ 'LENGTH',
123
+ 'FIND',
124
+ 'SEARCH',
125
+ 'INDEXOF',
126
+ ] as const;
127
+
128
+ // String functions
129
+ const STRING_FUNCTIONS = [
130
+ 'LOWER',
131
+ 'UPPER',
132
+ 'TRIM',
133
+ 'LTRIM',
134
+ 'RTRIM',
135
+ 'SUBSTRING',
136
+ 'SUBSTR',
137
+ 'LEFT',
138
+ 'RIGHT',
139
+ 'REPLACE',
140
+ 'CONCAT',
141
+ 'CONCATENATE',
142
+ 'TEXT',
143
+ 'FORMAT',
144
+ 'MID',
145
+ 'REPT',
146
+ 'UUID',
147
+ 'TOSTRING',
148
+ 'STRING',
149
+ ] as const;
150
+
151
+ // Logical functions
152
+ const LOGICAL_FUNCTIONS = [
153
+ 'IF',
154
+ 'IFS',
155
+ 'SWITCH',
156
+ 'IFNA',
157
+ 'ISBLANK',
158
+ 'ISEMPTY',
159
+ 'ISNUMBER',
160
+ 'ISNUMERIC',
161
+ 'HAS',
162
+ 'HASSOME',
163
+ 'HASALL',
164
+ 'IN',
165
+ 'INCLUDES',
166
+ 'CONTAINS',
167
+ 'STARTSWITH',
168
+ 'ENDSWITH',
169
+ 'MATCHES',
170
+ 'REGEXMATCH',
171
+ ] as const;
172
+
173
+ // Aggregate functions
174
+ const AGGREGATE_FUNCTIONS = [
175
+ 'SUM',
176
+ 'AVG',
177
+ 'AVERAGE',
178
+ 'AVERAGEXNEG',
179
+ 'AVERAGEXZERO',
180
+ 'AVERAGEXZERONEG',
181
+ 'COUNT',
182
+ 'COUNTDISTINCT',
183
+ 'COUNTIF',
184
+ 'SUMIF',
185
+ 'AVERAGEIF',
186
+ 'MIN',
187
+ 'MAX',
188
+ 'MEDIAN',
189
+ 'MODE',
190
+ 'PERCENTILE',
191
+ 'QUARTILE',
192
+ 'STDEV',
193
+ 'STDEVP',
194
+ 'VAR',
195
+ 'VARP',
196
+ ] as const;
197
+
198
+ // Other function types
199
+ const PERCENT_FUNCTIONS = ['PCT', 'PERCENT'] as const;
200
+
201
+ // Function - return type map
202
+ export const FUNCTION_RETURN_TYPE: Record<string, EDataType> = Object.fromEntries([
203
+ ...DATE_FUNCTIONS.map((fn) => [fn, EDataType.DATE]),
204
+ ...NUMERIC_FUNCTIONS.map((fn) => [fn, EDataType.NUMBER]),
205
+ ...STRING_FUNCTIONS.map((fn) => [fn, EDataType.STRING]),
206
+ ...LOGICAL_FUNCTIONS.map((fn) => [fn, EDataType.BOOLEAN]),
207
+ ...AGGREGATE_FUNCTIONS.map((fn) => [fn, EDataType.NUMBER]),
208
+ ...PERCENT_FUNCTIONS.map((fn) => [fn, EDataType.NUMBER]),
209
+ ]);
210
+
211
+ // SQL Expression Enums
212
+ export enum ESqlDateExpression {
213
+ CURRENT_DATE = 'CURRENT_DATE',
214
+ GETDATE = 'GETDATE()',
215
+ CURRENT_TIMESTAMP = 'CURRENT_TIMESTAMP',
216
+ NOW = 'NOW()',
217
+ SYSDATE = 'SYSDATE',
218
+ }
219
+
220
+ export enum ESqlMathExpression {
221
+ RAND = 'RAND()',
222
+ NEWID = 'NEWID()',
223
+ }
224
+
225
+ export enum ESqlWindowExpression {
226
+ ROW_NUMBER = 'ROW_NUMBER()',
227
+ PERCENTILE_CONT = 'PERCENTILE_CONT',
228
+ COUNT = 'COUNT',
229
+ }
230
+
231
+ export type SqlExpression = ESqlDateExpression | ESqlMathExpression | ESqlWindowExpression;
232
+
233
+ // Function Type Unions
234
+ export type DateFunction = (typeof DATE_FUNCTIONS)[number];
235
+ export type NumericFunction = (typeof NUMERIC_FUNCTIONS)[number];
236
+ export type StringFunction = (typeof STRING_FUNCTIONS)[number];
237
+ export type LogicalFunction = (typeof LOGICAL_FUNCTIONS)[number];
238
+ export type AggregateFunction = (typeof AGGREGATE_FUNCTIONS)[number];
239
+ export type PercentFunction = (typeof PERCENT_FUNCTIONS)[number];
240
+
241
+ export type FunctionType =
242
+ | DateFunction
243
+ | NumericFunction
244
+ | StringFunction
245
+ | LogicalFunction
246
+ | AggregateFunction
247
+ | PercentFunction;
@@ -0,0 +1,27 @@
1
+ // entry point: routes options to the correct dialect builder
2
+ import { DuckDbQueryBuilder } from '@epm-query-builder/dialects/duckdb/DuckDbQueryBuilder';
3
+ import { DATABASE_TYPES } from '@epm-query-builder/constants/Database';
4
+ import { IDatabaseQueryBuilder } from '@epm-query-builder/interfaces';
5
+ import { EpmQueryBuilderOptions } from '@epm-query-builder/types/query-builder-types';
6
+
7
+ export class EpmQueryBuilder {
8
+ private readonly impl: IDatabaseQueryBuilder;
9
+
10
+ constructor(options: EpmQueryBuilderOptions) {
11
+ const databaseType = options.databaseDetails?.databaseType as string;
12
+
13
+ switch (databaseType?.toLowerCase()) {
14
+ // add other database types here
15
+ case DATABASE_TYPES.DUCKDB:
16
+ this.impl = new DuckDbQueryBuilder(options);
17
+ break;
18
+ default:
19
+ throw new Error(`Unsupported database type: ${databaseType}`);
20
+ }
21
+ }
22
+
23
+ build(): string {
24
+ // delegates to dialect implementation; keep method name stable for public api
25
+ return this.impl.generateQuery();
26
+ }
27
+ }
@@ -0,0 +1,161 @@
1
+ import {
2
+ EpmQueryBuilderOptions,
3
+ MeasureConfig,
4
+ } from '@epm-query-builder/types/query-builder-types';
5
+ import { BaseUtilities } from '@epm-query-builder/base/BaseUtilities';
6
+
7
+ export class BaseAdvancedAggregations {
8
+ protected options: EpmQueryBuilderOptions;
9
+
10
+ constructor(options: EpmQueryBuilderOptions) {
11
+ this.options = options;
12
+ }
13
+
14
+ buildArrayAggregation(measure: MeasureConfig, distinct = false): string {
15
+ const columnRef = BaseUtilities.buildColumnReference(
16
+ measure.tableName,
17
+ measure.columnName || measure.id,
18
+ );
19
+ const distinctClause = distinct ? 'DISTINCT ' : '';
20
+
21
+ return `ARRAY_AGG(${distinctClause}${columnRef})`;
22
+ }
23
+
24
+ buildStringAggregation(measure: MeasureConfig, separator = ', ', distinct = false): string {
25
+ const columnRef = BaseUtilities.buildColumnReference(
26
+ measure.tableName,
27
+ measure.columnName || measure.id,
28
+ );
29
+ const distinctClause = distinct ? 'DISTINCT ' : '';
30
+
31
+ return `STRING_AGG(${distinctClause}${columnRef}, '${separator}')`;
32
+ }
33
+
34
+ buildJsonAggregation(measure: MeasureConfig, distinct = false): string {
35
+ const columnRef = BaseUtilities.buildColumnReference(
36
+ measure.tableName,
37
+ measure.columnName || measure.id,
38
+ );
39
+ const distinctClause = distinct ? 'DISTINCT ' : '';
40
+
41
+ return `JSON_AGG(${distinctClause}${columnRef})`;
42
+ }
43
+
44
+ buildJsonObjectAggregation(keyColumn: string, valueColumn: string): string {
45
+ return `JSON_OBJECT_AGG(${keyColumn}, ${valueColumn})`;
46
+ }
47
+
48
+ buildApproximateCountDistinct(measure: MeasureConfig): string {
49
+ const columnRef = BaseUtilities.buildColumnReference(
50
+ measure.tableName,
51
+ measure.columnName || measure.id,
52
+ );
53
+
54
+ return `APPROX_COUNT_DISTINCT(${columnRef})`;
55
+ }
56
+
57
+ buildCorrelation(measure1: MeasureConfig, measure2: MeasureConfig): string {
58
+ const columnRef1 = BaseUtilities.buildColumnReference(
59
+ measure1.tableName,
60
+ measure1.columnName || measure1.id,
61
+ );
62
+ const columnRef2 = BaseUtilities.buildColumnReference(
63
+ measure2.tableName,
64
+ measure2.columnName || measure2.id,
65
+ );
66
+
67
+ return `CORR(${columnRef1}, ${columnRef2})`;
68
+ }
69
+
70
+ buildCovariance(measure1: MeasureConfig, measure2: MeasureConfig, population = false): string {
71
+ const columnRef1 = BaseUtilities.buildColumnReference(
72
+ measure1.tableName,
73
+ measure1.columnName || measure1.id,
74
+ );
75
+ const columnRef2 = BaseUtilities.buildColumnReference(
76
+ measure2.tableName,
77
+ measure2.columnName || measure2.id,
78
+ );
79
+ const functionName = population ? 'COVAR_POP' : 'COVAR_SAMP';
80
+
81
+ return `${functionName}(${columnRef1}, ${columnRef2})`;
82
+ }
83
+
84
+ buildRegressionStats(
85
+ xMeasure: MeasureConfig,
86
+ yMeasure: MeasureConfig,
87
+ statType: 'SLOPE' | 'INTERCEPT' | 'R2',
88
+ ): string {
89
+ const xColumnRef = BaseUtilities.buildColumnReference(
90
+ xMeasure.tableName,
91
+ xMeasure.columnName || xMeasure.id,
92
+ );
93
+ const yColumnRef = BaseUtilities.buildColumnReference(
94
+ yMeasure.tableName,
95
+ yMeasure.columnName || yMeasure.id,
96
+ );
97
+
98
+ switch (statType) {
99
+ case 'SLOPE':
100
+ return `REGR_SLOPE(${yColumnRef}, ${xColumnRef})`;
101
+ case 'INTERCEPT':
102
+ return `REGR_INTERCEPT(${yColumnRef}, ${xColumnRef})`;
103
+ case 'R2':
104
+ return `REGR_R2(${yColumnRef}, ${xColumnRef})`;
105
+ default:
106
+ return `REGR_SLOPE(${yColumnRef}, ${xColumnRef})`;
107
+ }
108
+ }
109
+
110
+ buildBitAggregations(measure: MeasureConfig, operation: 'AND' | 'OR' | 'XOR'): string {
111
+ const columnRef = BaseUtilities.buildColumnReference(
112
+ measure.tableName,
113
+ measure.columnName || measure.id,
114
+ );
115
+
116
+ switch (operation) {
117
+ case 'AND':
118
+ return `BIT_AND(${columnRef})`;
119
+ case 'OR':
120
+ return `BIT_OR(${columnRef})`;
121
+ case 'XOR':
122
+ return `BIT_XOR(${columnRef})`;
123
+ default:
124
+ return `BIT_AND(${columnRef})`;
125
+ }
126
+ }
127
+
128
+ buildBoolAggregations(measure: MeasureConfig, operation: 'AND' | 'OR'): string {
129
+ const columnRef = BaseUtilities.buildColumnReference(
130
+ measure.tableName,
131
+ measure.columnName || measure.id,
132
+ );
133
+
134
+ switch (operation) {
135
+ case 'AND':
136
+ return `BOOL_AND(${columnRef})`;
137
+ case 'OR':
138
+ return `BOOL_OR(${columnRef})`;
139
+ default:
140
+ return `BOOL_AND(${columnRef})`;
141
+ }
142
+ }
143
+
144
+ buildGeometricMean(measure: MeasureConfig): string {
145
+ const columnRef = BaseUtilities.buildColumnReference(
146
+ measure.tableName,
147
+ measure.columnName || measure.id,
148
+ );
149
+
150
+ return `EXP(AVG(LN(${columnRef})))`;
151
+ }
152
+
153
+ buildHarmonicMean(measure: MeasureConfig): string {
154
+ const columnRef = BaseUtilities.buildColumnReference(
155
+ measure.tableName,
156
+ measure.columnName || measure.id,
157
+ );
158
+
159
+ return `COUNT(${columnRef}) / SUM(1.0 / ${columnRef})`;
160
+ }
161
+ }