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,329 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <testsuites name="DSL to SQL Tests" tests="150" failures="0" errors="0" time="0.776">
3
+ <testsuite name="QueryBuilder" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.2" tests="25">
4
+ <testcase classname="QueryBuilder should create sql query when table does not have formula columns" name="QueryBuilder should create sql query when table does not have formula columns" time="0.004">
5
+ </testcase>
6
+ <testcase classname="QueryBuilder should create sql query with pagination based on mssql database" name="QueryBuilder should create sql query with pagination based on mssql database" time="0">
7
+ </testcase>
8
+ <testcase classname="QueryBuilder should create sql query when table does not have formula columns and distinct is true" name="QueryBuilder should create sql query when table does not have formula columns and distinct is true" time="0.001">
9
+ </testcase>
10
+ <testcase classname="QueryBuilder should create sql query when table has formula columns with resolved expression as column expression" name="QueryBuilder should create sql query when table has formula columns with resolved expression as column expression" time="0.001">
11
+ </testcase>
12
+ <testcase classname="QueryBuilder should create sql query when table has formula columns with resolved expression as column expression and distinct is true" name="QueryBuilder should create sql query when table has formula columns with resolved expression as column expression and distinct is true" time="0.001">
13
+ </testcase>
14
+ <testcase classname="QueryBuilder should create sql query when table has formula columns with resolved expression as column expression with dependency only on native columns" name="QueryBuilder should create sql query when table has formula columns with resolved expression as column expression with dependency only on native columns" time="0">
15
+ </testcase>
16
+ <testcase classname="QueryBuilder should create sql query when table has multiple formula columns with resolved expression as column expression" name="QueryBuilder should create sql query when table has multiple formula columns with resolved expression as column expression" time="0.001">
17
+ </testcase>
18
+ <testcase classname="QueryBuilder should create sql query when table has formula columns with resolved expression as cte" name="QueryBuilder should create sql query when table has formula columns with resolved expression as cte" time="0.001">
19
+ </testcase>
20
+ <testcase classname="QueryBuilder should create sql query when table has formula columns with resolved expression as column expression with filter and sort and distinct is true" name="QueryBuilder should create sql query when table has formula columns with resolved expression as column expression with filter and sort and distinct is true" time="0.001">
21
+ </testcase>
22
+ <testcase classname="QueryBuilder should create sql query when table has formula columns with resolved expression as cte with filter and sort" name="QueryBuilder should create sql query when table has formula columns with resolved expression as cte with filter and sort" time="0.001">
23
+ </testcase>
24
+ <testcase classname="QueryBuilder should create sql query when table has formula columns with resolved expression containing aggregate function as cte with filter and sort" name="QueryBuilder should create sql query when table has formula columns with resolved expression containing aggregate function as cte with filter and sort" time="0">
25
+ </testcase>
26
+ <testcase classname="QueryBuilder shouild create query including dependencies which are not part of selected columns" name="QueryBuilder shouild create query including dependencies which are not part of selected columns" time="0.001">
27
+ </testcase>
28
+ <testcase classname="QueryBuilder should return calculation order" name="QueryBuilder should return calculation order" time="0.001">
29
+ </testcase>
30
+ <testcase classname="QueryBuilder should create count query" name="QueryBuilder should create count query" time="0">
31
+ </testcase>
32
+ <testcase classname="QueryBuilder should create distinct count query with formula column having filter" name="QueryBuilder should create distinct count query with formula column having filter" time="0.001">
33
+ </testcase>
34
+ <testcase classname="QueryBuilder should create distinct count query with formula column having no filters on formula column" name="QueryBuilder should create distinct count query with formula column having no filters on formula column" time="0.001">
35
+ </testcase>
36
+ <testcase classname="QueryBuilder should create count query for multiple columns with formula column dependency on just native column" name="QueryBuilder should create count query for multiple columns with formula column dependency on just native column" time="0">
37
+ </testcase>
38
+ <testcase classname="QueryBuilder should create count query for multiple columns with formula column dependency on another formula column" name="QueryBuilder should create count query for multiple columns with formula column dependency on another formula column" time="0.001">
39
+ </testcase>
40
+ <testcase classname="QueryBuilder should create distinct count query for multiple columns with formula column dependency on another formula column" name="QueryBuilder should create distinct count query for multiple columns with formula column dependency on another formula column" time="0">
41
+ </testcase>
42
+ <testcase classname="QueryBuilder should add search expression to the query with only native columns" name="QueryBuilder should add search expression to the query with only native columns" time="0.001">
43
+ </testcase>
44
+ <testcase classname="QueryBuilder should add search expression to the query with formula columns having resolved expression as column expression" name="QueryBuilder should add search expression to the query with formula columns having resolved expression as column expression" time="0">
45
+ </testcase>
46
+ <testcase classname="QueryBuilder should add search expression to the query with formula columns dependent on another formula column" name="QueryBuilder should add search expression to the query with formula columns dependent on another formula column" time="0.001">
47
+ </testcase>
48
+ <testcase classname="QueryBuilder should resolve runtime variables" name="QueryBuilder should resolve runtime variables" time="0">
49
+ </testcase>
50
+ <testcase classname="QueryBuilder should create distinct count query with formula column dependency on just native column and more than one selected column" name="QueryBuilder should create distinct count query with formula column dependency on just native column and more than one selected column" time="0.001">
51
+ </testcase>
52
+ <testcase classname="QueryBuilder should create distinct count query for multiple columns with formula column dependency on another formula column and more than one selected column" name="QueryBuilder should create distinct count query for multiple columns with formula column dependency on another formula column and more than one selected column" time="0">
53
+ </testcase>
54
+ </testsuite>
55
+ <testsuite name="CallExpressionVisitor" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.127" tests="78">
56
+ <testcase classname="CallExpressionVisitor Logical Functions should transform IF function to Sql case-when" name="CallExpressionVisitor Logical Functions should transform IF function to Sql case-when" time="0.004">
57
+ </testcase>
58
+ <testcase classname="CallExpressionVisitor Logical Functions should transform AND function to Sql AND operator" name="CallExpressionVisitor Logical Functions should transform AND function to Sql AND operator" time="0.001">
59
+ </testcase>
60
+ <testcase classname="CallExpressionVisitor Logical Functions should transform OR function to Sql OR operator" name="CallExpressionVisitor Logical Functions should transform OR function to Sql OR operator" time="0.001">
61
+ </testcase>
62
+ <testcase classname="CallExpressionVisitor Logical Functions should transform NOT function to Sql NOT operator" name="CallExpressionVisitor Logical Functions should transform NOT function to Sql NOT operator" time="0.001">
63
+ </testcase>
64
+ <testcase classname="CallExpressionVisitor Logical Functions should transform XOR function to Sql XOR operator" name="CallExpressionVisitor Logical Functions should transform XOR function to Sql XOR operator" time="0.001">
65
+ </testcase>
66
+ <testcase classname="CallExpressionVisitor Date Functions should transform DATEADD function to Sql DATEADD function" name="CallExpressionVisitor Date Functions should transform DATEADD function to Sql DATEADD function" time="0.001">
67
+ </testcase>
68
+ <testcase classname="CallExpressionVisitor Date Functions should transform DATEADD with TODAY() function to Sql DATEADD function" name="CallExpressionVisitor Date Functions should transform DATEADD with TODAY() function to Sql DATEADD function" time="0.001">
69
+ </testcase>
70
+ <testcase classname="CallExpressionVisitor Date Functions should transform DATEDIFF function to Sql DATEDIFF function" name="CallExpressionVisitor Date Functions should transform DATEDIFF function to Sql DATEDIFF function" time="0">
71
+ </testcase>
72
+ <testcase classname="CallExpressionVisitor Date Functions should transform DATEDIFF with TODAY() function to Sql DATEDIFF function" name="CallExpressionVisitor Date Functions should transform DATEDIFF with TODAY() function to Sql DATEDIFF function" time="0.002">
73
+ </testcase>
74
+ <testcase classname="CallExpressionVisitor Date Functions should transform DAY function to Sql DAY function" name="CallExpressionVisitor Date Functions should transform DAY function to Sql DAY function" time="0.001">
75
+ </testcase>
76
+ <testcase classname="CallExpressionVisitor Date Functions should transform EOMONTH function to Sql EOMONTH function" name="CallExpressionVisitor Date Functions should transform EOMONTH function to Sql EOMONTH function" time="0.001">
77
+ </testcase>
78
+ <testcase classname="CallExpressionVisitor Date Functions should transform MONTH function to Sql MONTH function" name="CallExpressionVisitor Date Functions should transform MONTH function to Sql MONTH function" time="0">
79
+ </testcase>
80
+ <testcase classname="CallExpressionVisitor Date Functions should transform NOW function to Sql NOW function" name="CallExpressionVisitor Date Functions should transform NOW function to Sql NOW function" time="0.001">
81
+ </testcase>
82
+ <testcase classname="CallExpressionVisitor Date Functions should transform TODAY function to Sql TODAY function" name="CallExpressionVisitor Date Functions should transform TODAY function to Sql TODAY function" time="0">
83
+ </testcase>
84
+ <testcase classname="CallExpressionVisitor Date Functions should transform YEAR function to Sql YEAR function" name="CallExpressionVisitor Date Functions should transform YEAR function to Sql YEAR function" time="0">
85
+ </testcase>
86
+ <testcase classname="CallExpressionVisitor String Functions should transform CONCATENATE function to Sql CONCAT function" name="CallExpressionVisitor String Functions should transform CONCATENATE function to Sql CONCAT function" time="0">
87
+ </testcase>
88
+ <testcase classname="CallExpressionVisitor String Functions should transform ISBLANK function to Sql case-when function" name="CallExpressionVisitor String Functions should transform ISBLANK function to Sql case-when function" time="0.001">
89
+ </testcase>
90
+ <testcase classname="CallExpressionVisitor String Functions should transform ISEMPTY function to Sql case-when function" name="CallExpressionVisitor String Functions should transform ISEMPTY function to Sql case-when function" time="0">
91
+ </testcase>
92
+ <testcase classname="CallExpressionVisitor String Functions should transform LEFT function to Sql LEFT function" name="CallExpressionVisitor String Functions should transform LEFT function to Sql LEFT function" time="0.001">
93
+ </testcase>
94
+ <testcase classname="CallExpressionVisitor String Functions should transform LEN function to Sql LEN function" name="CallExpressionVisitor String Functions should transform LEN function to Sql LEN function" time="0">
95
+ </testcase>
96
+ <testcase classname="CallExpressionVisitor String Functions should transform LOWER function to Sql LOWER function" name="CallExpressionVisitor String Functions should transform LOWER function to Sql LOWER function" time="0.001">
97
+ </testcase>
98
+ <testcase classname="CallExpressionVisitor String Functions should transform MATCH function to Sql MATCH function" name="CallExpressionVisitor String Functions should transform MATCH function to Sql MATCH function" time="0">
99
+ </testcase>
100
+ <testcase classname="CallExpressionVisitor String Functions should transform MID function to Sql MID function" name="CallExpressionVisitor String Functions should transform MID function to Sql MID function" time="0.001">
101
+ </testcase>
102
+ <testcase classname="CallExpressionVisitor String Functions should transform NUMBERVALUE function to Sql NUMBERVALUE function" name="CallExpressionVisitor String Functions should transform NUMBERVALUE function to Sql NUMBERVALUE function" time="0">
103
+ </testcase>
104
+ <testcase classname="CallExpressionVisitor String Functions should transform REPLACE function to Sql REPLACE function" name="CallExpressionVisitor String Functions should transform REPLACE function to Sql REPLACE function" time="0.001">
105
+ </testcase>
106
+ <testcase classname="CallExpressionVisitor String Functions should transform REPT function to Sql REPT function" name="CallExpressionVisitor String Functions should transform REPT function to Sql REPT function" time="0">
107
+ </testcase>
108
+ <testcase classname="CallExpressionVisitor String Functions should transform RIGHT function to Sql RIGHT function" name="CallExpressionVisitor String Functions should transform RIGHT function to Sql RIGHT function" time="0.003">
109
+ </testcase>
110
+ <testcase classname="CallExpressionVisitor String Functions should transform TRIM function to Sql TRIM function" name="CallExpressionVisitor String Functions should transform TRIM function to Sql TRIM function" time="0.001">
111
+ </testcase>
112
+ <testcase classname="CallExpressionVisitor String Functions should transform UPPER function to Sql UPPER function" name="CallExpressionVisitor String Functions should transform UPPER function to Sql UPPER function" time="0">
113
+ </testcase>
114
+ <testcase classname="CallExpressionVisitor String Functions should transform VALUE function to Sql VALUE function" name="CallExpressionVisitor String Functions should transform VALUE function to Sql VALUE function" time="0.001">
115
+ </testcase>
116
+ <testcase classname="CallExpressionVisitor String Functions should transform TEXT function to Sql TEXT function for date" name="CallExpressionVisitor String Functions should transform TEXT function to Sql TEXT function for date" time="0">
117
+ </testcase>
118
+ <testcase classname="CallExpressionVisitor String Functions should transform TEXT function to Sql TEXT function for date to extract month" name="CallExpressionVisitor String Functions should transform TEXT function to Sql TEXT function for date to extract month" time="0.001">
119
+ </testcase>
120
+ <testcase classname="CallExpressionVisitor String Functions should transform TEXT function to Sql TEXT function for number with currency" name="CallExpressionVisitor String Functions should transform TEXT function to Sql TEXT function for number with currency" time="0">
121
+ </testcase>
122
+ <testcase classname="CallExpressionVisitor Math Functions should transform ABS function to Sql ABS function" name="CallExpressionVisitor Math Functions should transform ABS function to Sql ABS function" time="0.001">
123
+ </testcase>
124
+ <testcase classname="CallExpressionVisitor Math Functions should transform AVERAGE function to Sql expression" name="CallExpressionVisitor Math Functions should transform AVERAGE function to Sql expression" time="0.001">
125
+ </testcase>
126
+ <testcase classname="CallExpressionVisitor Math Functions should transform AVERAGEIF function to Sql expression" name="CallExpressionVisitor Math Functions should transform AVERAGEIF function to Sql expression" time="0.001">
127
+ </testcase>
128
+ <testcase classname="CallExpressionVisitor Math Functions should transform AVERAGEXNEG function to Sql expression" name="CallExpressionVisitor Math Functions should transform AVERAGEXNEG function to Sql expression" time="0.001">
129
+ </testcase>
130
+ <testcase classname="CallExpressionVisitor Math Functions should transform AVERAGEXZERO function to Sql expression" name="CallExpressionVisitor Math Functions should transform AVERAGEXZERO function to Sql expression" time="0">
131
+ </testcase>
132
+ <testcase classname="CallExpressionVisitor Math Functions should transform AVERAGEXZERONEG function to Sql expression" name="CallExpressionVisitor Math Functions should transform AVERAGEXZERONEG function to Sql expression" time="0.001">
133
+ </testcase>
134
+ <testcase classname="CallExpressionVisitor Math Functions should transform DATE function to Sql expression" name="CallExpressionVisitor Math Functions should transform DATE function to Sql expression" time="0">
135
+ </testcase>
136
+ <testcase classname="CallExpressionVisitor Math Functions should transform CEILING function to Sql CEIL function" name="CallExpressionVisitor Math Functions should transform CEILING function to Sql CEIL function" time="0">
137
+ </testcase>
138
+ <testcase classname="CallExpressionVisitor Math Functions should transform DIVIDE function to Sql DIVIDE function" name="CallExpressionVisitor Math Functions should transform DIVIDE function to Sql DIVIDE function" time="0">
139
+ </testcase>
140
+ <testcase classname="CallExpressionVisitor Math Functions should transform INDEXOF function to Sql INDEXOF function" name="CallExpressionVisitor Math Functions should transform INDEXOF function to Sql INDEXOF function" time="0.001">
141
+ </testcase>
142
+ <testcase classname="CallExpressionVisitor Math Functions should transform IN function to Sql IN function" name="CallExpressionVisitor Math Functions should transform IN function to Sql IN function" time="0">
143
+ </testcase>
144
+ <testcase classname="CallExpressionVisitor Math Functions should transform ISNUMBER function to Sql ISNUMERIC function" name="CallExpressionVisitor Math Functions should transform ISNUMBER function to Sql ISNUMERIC function" time="0.001">
145
+ </testcase>
146
+ <testcase classname="CallExpressionVisitor Math Functions should transform EXP function to Sql EXP function" name="CallExpressionVisitor Math Functions should transform EXP function to Sql EXP function" time="0">
147
+ </testcase>
148
+ <testcase classname="CallExpressionVisitor Math Functions should transform FLOOR function to Sql FLOOR function" name="CallExpressionVisitor Math Functions should transform FLOOR function to Sql FLOOR function" time="0.002">
149
+ </testcase>
150
+ <testcase classname="CallExpressionVisitor Math Functions should transform LOG function to Sql LOG function" name="CallExpressionVisitor Math Functions should transform LOG function to Sql LOG function" time="0.001">
151
+ </testcase>
152
+ <testcase classname="CallExpressionVisitor Math Functions should transform MAX function to Sql MAX function" name="CallExpressionVisitor Math Functions should transform MAX function to Sql MAX function" time="0">
153
+ </testcase>
154
+ <testcase classname="CallExpressionVisitor Math Functions should transform MIN function to Sql MIN function" name="CallExpressionVisitor Math Functions should transform MIN function to Sql MIN function" time="0.001">
155
+ </testcase>
156
+ <testcase classname="CallExpressionVisitor Math Functions should transform MOD function to Sql MOD function" name="CallExpressionVisitor Math Functions should transform MOD function to Sql MOD function" time="0">
157
+ </testcase>
158
+ <testcase classname="CallExpressionVisitor Math Functions should transform ODD function to Sql ODD function" name="CallExpressionVisitor Math Functions should transform ODD function to Sql ODD function" time="0.001">
159
+ </testcase>
160
+ <testcase classname="CallExpressionVisitor Math Functions should transform EVEN function to Sql EVEN function" name="CallExpressionVisitor Math Functions should transform EVEN function to Sql EVEN function" time="0.001">
161
+ </testcase>
162
+ <testcase classname="CallExpressionVisitor Math Functions should transform SWITCH function to Sql SWITCH function" name="CallExpressionVisitor Math Functions should transform SWITCH function to Sql SWITCH function" time="0.001">
163
+ </testcase>
164
+ <testcase classname="CallExpressionVisitor Math Functions should transform POW function to Sql POW function" name="CallExpressionVisitor Math Functions should transform POW function to Sql POW function" time="0.001">
165
+ </testcase>
166
+ <testcase classname="CallExpressionVisitor Math Functions should transform PCT function to Sql PCT function" name="CallExpressionVisitor Math Functions should transform PCT function to Sql PCT function" time="0">
167
+ </testcase>
168
+ <testcase classname="CallExpressionVisitor Math Functions should transform IFNA function to Sql IFNA function" name="CallExpressionVisitor Math Functions should transform IFNA function to Sql IFNA function" time="0.001">
169
+ </testcase>
170
+ <testcase classname="CallExpressionVisitor Math Functions should transform RAND function to Sql RAND function" name="CallExpressionVisitor Math Functions should transform RAND function to Sql RAND function" time="0">
171
+ </testcase>
172
+ <testcase classname="CallExpressionVisitor Math Functions should transform RANDBETWEEN function to Sql RANDBETWEEN function" name="CallExpressionVisitor Math Functions should transform RANDBETWEEN function to Sql RANDBETWEEN function" time="0">
173
+ </testcase>
174
+ <testcase classname="CallExpressionVisitor Math Functions should transform ROUND function to Sql ROUND function" name="CallExpressionVisitor Math Functions should transform ROUND function to Sql ROUND function" time="0.001">
175
+ </testcase>
176
+ <testcase classname="CallExpressionVisitor Math Functions should transform SUM function to Sql SUM function" name="CallExpressionVisitor Math Functions should transform SUM function to Sql SUM function" time="0">
177
+ </testcase>
178
+ <testcase classname="CallExpressionVisitor Math Functions should transform SQRT function to Sql SQRT function" name="CallExpressionVisitor Math Functions should transform SQRT function to Sql SQRT function" time="0.001">
179
+ </testcase>
180
+ <testcase classname="CallExpressionVisitor Math Functions should transform MEDIAN function to Sql MEDIAN function" name="CallExpressionVisitor Math Functions should transform MEDIAN function to Sql MEDIAN function" time="0.001">
181
+ </testcase>
182
+ <testcase classname="CallExpressionVisitor should throw error for unsupported function" name="CallExpressionVisitor should throw error for unsupported function" time="0.003">
183
+ </testcase>
184
+ <testcase classname="CallExpressionVisitor should transform LOGGEDIN_EMAIL function to Sql $RUNTIME_LOGGEDIN_EMAIL function" name="CallExpressionVisitor should transform LOGGEDIN_EMAIL function to Sql $RUNTIME_LOGGEDIN_EMAIL function" time="0">
185
+ </testcase>
186
+ <testcase classname="CallExpressionVisitor should transform CURRENT_DATE function to Sql $RUNTIME_CURRENT_DATE function" name="CallExpressionVisitor should transform CURRENT_DATE function to Sql $RUNTIME_CURRENT_DATE function" time="0">
187
+ </testcase>
188
+ <testcase classname="CallExpressionVisitor should transform CURRENT_DATE function to Sql $RUNTIME_CURRENT_DATETIME function" name="CallExpressionVisitor should transform CURRENT_DATE function to Sql $RUNTIME_CURRENT_DATETIME function" time="0.001">
189
+ </testcase>
190
+ <testcase classname="CallExpressionVisitor should transform LOGGEDIN_NAME function to Sql $RUNTIME_LOGGEDIN_NAME function" name="CallExpressionVisitor should transform LOGGEDIN_NAME function to Sql $RUNTIME_LOGGEDIN_NAME function" time="0">
191
+ </testcase>
192
+ <testcase classname="CallExpressionVisitor should transform LOGGEDIN_EMAIL function to Sql $RUNTIME_LOGGEDIN_EMAIL function" name="CallExpressionVisitor should transform LOGGEDIN_EMAIL function to Sql $RUNTIME_LOGGEDIN_EMAIL function" time="0.003">
193
+ </testcase>
194
+ <testcase classname="CallExpressionVisitor should transform UUID function to Sql NEWID() function" name="CallExpressionVisitor should transform UUID function to Sql NEWID() function" time="0">
195
+ </testcase>
196
+ <testcase classname="CallExpressionVisitor should transform FROMEXCELDATE function to Sql DATEADD() function" name="CallExpressionVisitor should transform FROMEXCELDATE function to Sql DATEADD() function" time="0">
197
+ </testcase>
198
+ <testcase classname="CallExpressionVisitor should transform HAS function to Sql HAS() function" name="CallExpressionVisitor should transform HAS function to Sql HAS() function" time="0.001">
199
+ </testcase>
200
+ <testcase classname="CallExpressionVisitor should transform HAS_SOME function to Sql HAS_SOME() function" name="CallExpressionVisitor should transform HAS_SOME function to Sql HAS_SOME() function" time="0.001">
201
+ </testcase>
202
+ <testcase classname="CallExpressionVisitor should transform HAS_ALL function to Sql HAS_ALL() function" name="CallExpressionVisitor should transform HAS_ALL function to Sql HAS_ALL() function" time="0.001">
203
+ </testcase>
204
+ <testcase classname="CallExpressionVisitor should transform FIND function to SQL" name="CallExpressionVisitor should transform FIND function to SQL" time="0">
205
+ </testcase>
206
+ <testcase classname="CallExpressionVisitor should transform FIND with start argument to SQL" name="CallExpressionVisitor should transform FIND with start argument to SQL" time="0.001">
207
+ </testcase>
208
+ <testcase classname="CallExpressionVisitor should transform nested FIND inside LEFT" name="CallExpressionVisitor should transform nested FIND inside LEFT" time="0">
209
+ </testcase>
210
+ <testcase classname="CallExpressionVisitor should transform nested FIND inside MID" name="CallExpressionVisitor should transform nested FIND inside MID" time="0">
211
+ </testcase>
212
+ </testsuite>
213
+ <testsuite name="JsToSqlParser" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.038" tests="4">
214
+ <testcase classname="JsToSqlParser should parse formula and return resolved formula props" name="JsToSqlParser should parse formula and return resolved formula props" time="0.001">
215
+ </testcase>
216
+ <testcase classname="JsToSqlParser should parse formula with formula column dependencies and return resolved formula props" name="JsToSqlParser should parse formula with formula column dependencies and return resolved formula props" time="0.001">
217
+ </testcase>
218
+ <testcase classname="JsToSqlParser should find dependencies for formula including implicit primary key columns" name="JsToSqlParser should find dependencies for formula including implicit primary key columns" time="0.001">
219
+ </testcase>
220
+ <testcase classname="JsToSqlParser should resolve static identifiers via runtime variables" name="JsToSqlParser should resolve static identifiers via runtime variables" time="0">
221
+ </testcase>
222
+ </testsuite>
223
+ <testsuite name="sanity" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.045" tests="4">
224
+ <testcase classname="sanity should create sql query from formula for project status tracking" name="sanity should create sql query from formula for project status tracking" time="0.001">
225
+ </testcase>
226
+ <testcase classname="sanity should create sql query from formula for ROI" name="sanity should create sql query from formula for ROI" time="0.001">
227
+ </testcase>
228
+ <testcase classname="sanity should create sql query from formula for priority sorting" name="sanity should create sql query from formula for priority sorting" time="0.002">
229
+ </testcase>
230
+ <testcase classname="sanity should create sql query from formula for date intelligence" name="sanity should create sql query from formula for date intelligence" time="0.001">
231
+ </testcase>
232
+ </testsuite>
233
+ <testsuite name="toColumnRef" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.025" tests="5">
234
+ <testcase classname="toColumnRef should create a column reference without table name" name="toColumnRef should create a column reference without table name" time="0">
235
+ </testcase>
236
+ <testcase classname="toColumnRef should create a column reference with table name" name="toColumnRef should create a column reference with table name" time="0">
237
+ </testcase>
238
+ <testcase classname="toColumn should create a column without alias" name="toColumn should create a column without alias" time="0">
239
+ </testcase>
240
+ <testcase classname="toColumn should create a column with alias" name="toColumn should create a column with alias" time="0">
241
+ </testcase>
242
+ <testcase classname="toColumn should create a column from a complex expression" name="toColumn should create a column from a complex expression" time="0">
243
+ </testcase>
244
+ </testsuite>
245
+ <testsuite name="SelectBuilder" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.028" tests="6">
246
+ <testcase classname="SelectBuilder should build a basic SELECT statement" name="SelectBuilder should build a basic SELECT statement" time="0">
247
+ </testcase>
248
+ <testcase classname="SelectBuilder should build a SELECT statement with WHERE clause" name="SelectBuilder should build a SELECT statement with WHERE clause" time="0.001">
249
+ </testcase>
250
+ <testcase classname="SelectBuilder should build a SELECT statement with GROUP BY clause" name="SelectBuilder should build a SELECT statement with GROUP BY clause" time="0.001">
251
+ </testcase>
252
+ <testcase classname="WithBuilder should build a WITH clause" name="WithBuilder should build a WITH clause" time="0.001">
253
+ </testcase>
254
+ <testcase classname="WithBuilder should throw error when name is missing" name="WithBuilder should throw error when name is missing" time="0.001">
255
+ </testcase>
256
+ <testcase classname="WithBuilder should throw error when statement is missing" name="WithBuilder should throw error when statement is missing" time="0">
257
+ </testcase>
258
+ </testsuite>
259
+ <testsuite name="toFunction" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.023" tests="5">
260
+ <testcase classname="toFunction should create a function with no arguments" name="toFunction should create a function with no arguments" time="0.001">
261
+ </testcase>
262
+ <testcase classname="toFunction should create a function with a single argument" name="toFunction should create a function with a single argument" time="0.001">
263
+ </testcase>
264
+ <testcase classname="toFunction should create a function with multiple arguments" name="toFunction should create a function with multiple arguments" time="0">
265
+ </testcase>
266
+ <testcase classname="toFunction should create a function with column reference arguments" name="toFunction should create a function with column reference arguments" time="0">
267
+ </testcase>
268
+ <testcase classname="toFunction should create a function with mixed argument types" name="toFunction should create a function with mixed argument types" time="0">
269
+ </testcase>
270
+ </testsuite>
271
+ <testsuite name="toValue" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.025" tests="8">
272
+ <testcase classname="toValue should create a number literal" name="toValue should create a number literal" time="0.001">
273
+ </testcase>
274
+ <testcase classname="toValue should create a string literal" name="toValue should create a string literal" time="0">
275
+ </testcase>
276
+ <testcase classname="toValue should create a boolean literal - true" name="toValue should create a boolean literal - true" time="0">
277
+ </testcase>
278
+ <testcase classname="toValue should create a boolean literal - false" name="toValue should create a boolean literal - false" time="0.001">
279
+ </testcase>
280
+ <testcase classname="toValue should create a null literal" name="toValue should create a null literal" time="0">
281
+ </testcase>
282
+ <testcase classname="toValue should handle decimal numbers" name="toValue should handle decimal numbers" time="0">
283
+ </testcase>
284
+ <testcase classname="toValue should handle negative numbers" name="toValue should handle negative numbers" time="0.001">
285
+ </testcase>
286
+ <testcase classname="toValue should handle empty strings" name="toValue should handle empty strings" time="0">
287
+ </testcase>
288
+ </testsuite>
289
+ <testsuite name="toElse" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.02" tests="5">
290
+ <testcase classname="toElse should create an ELSE clause with a string literal" name="toElse should create an ELSE clause with a string literal" time="0">
291
+ </testcase>
292
+ <testcase classname="toElse should create an ELSE clause with a number literal" name="toElse should create an ELSE clause with a number literal" time="0.001">
293
+ </testcase>
294
+ <testcase classname="toElse should create an ELSE clause with a column reference" name="toElse should create an ELSE clause with a column reference" time="0">
295
+ </testcase>
296
+ <testcase classname="toElse should create an ELSE clause with a boolean literal" name="toElse should create an ELSE clause with a boolean literal" time="0">
297
+ </testcase>
298
+ <testcase classname="toElse should create an ELSE clause with a NULL literal" name="toElse should create an ELSE clause with a NULL literal" time="0.001">
299
+ </testcase>
300
+ </testsuite>
301
+ <testsuite name="toCase" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.022" tests="2">
302
+ <testcase classname="toCase should create a CASE expression with single WHEN-THEN-ELSE" name="toCase should create a CASE expression with single WHEN-THEN-ELSE" time="0.001">
303
+ </testcase>
304
+ <testcase classname="toCase should create a CASE expression with multiple WHEN-THEN clauses" name="toCase should create a CASE expression with multiple WHEN-THEN clauses" time="0">
305
+ </testcase>
306
+ </testsuite>
307
+ <testsuite name="toUnaryExpression" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.019" tests="2">
308
+ <testcase classname="toUnaryExpression should create a unary NOT expression for boolean literal" name="toUnaryExpression should create a unary NOT expression for boolean literal" time="0">
309
+ </testcase>
310
+ <testcase classname="toUnaryExpression should create a unary NOT expression for column reference" name="toUnaryExpression should create a unary NOT expression for column reference" time="0.002">
311
+ </testcase>
312
+ </testsuite>
313
+ <testsuite name="toBinaryExpression" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.018" tests="5">
314
+ <testcase classname="toBinaryExpression should create a binary expression with two literals" name="toBinaryExpression should create a binary expression with two literals" time="0.001">
315
+ </testcase>
316
+ <testcase classname="toBinaryExpression should create a binary expression with column references" name="toBinaryExpression should create a binary expression with column references" time="0">
317
+ </testcase>
318
+ <testcase classname="toBinaryExpression should create a binary expression with parentheses" name="toBinaryExpression should create a binary expression with parentheses" time="0">
319
+ </testcase>
320
+ <testcase classname="toBinaryExpression should create a binary expression with mixed operand types" name="toBinaryExpression should create a binary expression with mixed operand types" time="0.001">
321
+ </testcase>
322
+ <testcase classname="toBinaryExpression should create a binary expression with string literals" name="toBinaryExpression should create a binary expression with string literals" time="0">
323
+ </testcase>
324
+ </testsuite>
325
+ <testsuite name="utils" errors="0" failures="0" skipped="0" timestamp="2025-12-06T06:36:02" time="0.018" tests="1">
326
+ <testcase classname="utils should resolve runtime variables" name="utils should resolve runtime variables" time="0">
327
+ </testcase>
328
+ </testsuite>
329
+ </testsuites>
@@ -0,0 +1,163 @@
1
+ import {
2
+ ParseContext,
3
+ ResolvedExpressionType,
4
+ MDM_COLUMN_TYPE,
5
+ createJsToSqlParser,
6
+ ColumnExpression,
7
+ } from '../src';
8
+ import { RUNTIME_LOGGEDIN_EMAIL, RUNTIME_LOGGEDIN_NAME } from '../src/runtime_var';
9
+
10
+ // write tests for JsToSqlParser
11
+ describe('JsToSqlParser', () => {
12
+ test('should parse formula and return resolved formula props', () => {
13
+ const columnConfigMap = {
14
+ price: {
15
+ columnType: MDM_COLUMN_TYPE.NUMBER,
16
+ columnName: 'price',
17
+ columnMeta: {},
18
+ },
19
+ quantity: {
20
+ columnType: MDM_COLUMN_TYPE.NUMBER,
21
+ columnName: 'quantity',
22
+ columnMeta: {},
23
+ },
24
+ };
25
+ const context = new ParseContext({
26
+ columnConfigMap,
27
+ currentColumnId: 'sales',
28
+ primaryKeyColumns: ['product_id'],
29
+ tableName: 'products',
30
+ });
31
+ const parser = createJsToSqlParser(context);
32
+ const formula = `price * quantity`;
33
+ const ast = parser.parse(formula);
34
+ const resolvedFormulaProps = parser.getResolvedFormulaProps(ast);
35
+ expect(resolvedFormulaProps).toEqual({
36
+ sqlQueryProps: {
37
+ resolvedExpression: {
38
+ type: ResolvedExpressionType.COLUMN,
39
+ value: ['(COALESCE([price], 0) * COALESCE([quantity], 0))'],
40
+ },
41
+ },
42
+ deps: ['price', 'quantity'],
43
+ error: undefined,
44
+ isValid: true,
45
+ returnType: 'number',
46
+ });
47
+ });
48
+
49
+ test('should parse formula with formula column dependencies and return resolved formula props', () => {
50
+ const columnConfigMap = {
51
+ price: { columnType: MDM_COLUMN_TYPE.NUMBER, columnName: 'price', columnMeta: {} },
52
+ quantity: {
53
+ columnType: MDM_COLUMN_TYPE.NUMBER,
54
+ columnName: 'quantity',
55
+ columnMeta: {},
56
+ },
57
+ discount_percent: {
58
+ columnType: MDM_COLUMN_TYPE.NUMBER,
59
+ columnName: 'discount_percent',
60
+ columnMeta: {},
61
+ },
62
+ sale_price: {
63
+ columnType: MDM_COLUMN_TYPE.NUMBER,
64
+ columnName: 'sale_price',
65
+ columnMeta: {
66
+ sqlQueryProps: {
67
+ resolvedExpression: {
68
+ type: ResolvedExpressionType.COLUMN,
69
+ value: ['[price] * [quantity] * (1 - [discount_percent] / 100)'],
70
+ } as ColumnExpression,
71
+ },
72
+ deps: ['price', 'quantity', 'discount_percent'],
73
+ },
74
+ },
75
+ };
76
+ const context = new ParseContext({
77
+ columnConfigMap,
78
+ currentColumnId: 'difference',
79
+ primaryKeyColumns: ['product_id'],
80
+ tableName: 'products',
81
+ });
82
+ const parser = createJsToSqlParser(context);
83
+ const formula = `price * quantity - sale_price`;
84
+ const ast = parser.parse(formula);
85
+ const resolvedFormulaProps = parser.getResolvedFormulaProps(ast);
86
+ expect(resolvedFormulaProps).toEqual({
87
+ sqlQueryProps: {
88
+ resolvedExpression: {
89
+ type: ResolvedExpressionType.COLUMN,
90
+ value: [
91
+ '(COALESCE((COALESCE([price], 0) * COALESCE([quantity], 0)), 0) - COALESCE([sale_price], 0))',
92
+ ],
93
+ },
94
+ },
95
+ deps: ['price', 'quantity', 'sale_price'],
96
+ error: undefined,
97
+ isValid: true,
98
+ returnType: 'number',
99
+ });
100
+ });
101
+
102
+ test('should find dependencies for formula including implicit primary key columns', () => {
103
+ const columnConfigMap = {
104
+ price_1: { columnType: MDM_COLUMN_TYPE.NUMBER, columnName: 'price_1', columnMeta: {} },
105
+ price_2: { columnType: MDM_COLUMN_TYPE.NUMBER, columnName: 'price_2', columnMeta: {} },
106
+ price_3: { columnType: MDM_COLUMN_TYPE.NUMBER, columnName: 'price_3', columnMeta: {} },
107
+ };
108
+ const context = new ParseContext({
109
+ columnConfigMap,
110
+ currentColumnId: 'sales',
111
+ primaryKeyColumns: ['product_id', 'customer_id'],
112
+ tableName: 'products',
113
+ });
114
+
115
+ const formula = `AVERAGEEXZERO([price_1, price_2, price_3])`;
116
+ const parser = createJsToSqlParser(context);
117
+ const ast = parser.parse(formula);
118
+ const resolvedFormulaProps = parser.getResolvedFormulaProps(ast);
119
+ expect(resolvedFormulaProps.deps).toEqual([
120
+ 'price_1',
121
+ 'price_2',
122
+ 'price_3',
123
+ 'product_id',
124
+ 'customer_id',
125
+ ]);
126
+ });
127
+
128
+ test('should resolve static identifiers via runtime variables', () => {
129
+ const columnConfigMap = {
130
+ product_id: {
131
+ columnType: MDM_COLUMN_TYPE.NUMBER,
132
+ columnName: 'product_id',
133
+ columnMeta: {},
134
+ },
135
+ price_1: { columnType: MDM_COLUMN_TYPE.NUMBER, columnName: 'price_1', columnMeta: {} },
136
+ };
137
+ const context = new ParseContext({
138
+ columnConfigMap,
139
+ currentColumnId: 'info',
140
+ primaryKeyColumns: ['product_id'],
141
+ tableName: 'products',
142
+ });
143
+
144
+ const formula = `CONCAT('Name: ', LOGGEDIN_NAME, ', Email: ', LOGGEDIN_EMAIL)`;
145
+ const parser = createJsToSqlParser(context);
146
+ const ast = parser.parse(formula);
147
+ const resolvedFormulaProps = parser.getResolvedFormulaProps(ast);
148
+ expect(resolvedFormulaProps).toEqual({
149
+ sqlQueryProps: {
150
+ resolvedExpression: {
151
+ type: ResolvedExpressionType.COLUMN,
152
+ value: [
153
+ `CONCAT('Name: ', '${RUNTIME_LOGGEDIN_NAME}', ', Email: ', '${RUNTIME_LOGGEDIN_EMAIL}')`,
154
+ ],
155
+ },
156
+ },
157
+ deps: [],
158
+ error: undefined,
159
+ isValid: true,
160
+ returnType: 'string',
161
+ });
162
+ });
163
+ });