@simplysm/orm-common 13.0.100 → 14.0.4

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 (246) hide show
  1. package/README.md +90 -147
  2. package/dist/create-db-context.d.ts +10 -10
  3. package/dist/create-db-context.js +312 -276
  4. package/dist/create-db-context.js.map +1 -6
  5. package/dist/ddl/column-ddl.d.ts +4 -4
  6. package/dist/ddl/column-ddl.js +41 -35
  7. package/dist/ddl/column-ddl.js.map +1 -6
  8. package/dist/ddl/initialize.d.ts +17 -17
  9. package/dist/ddl/initialize.js +200 -142
  10. package/dist/ddl/initialize.js.map +1 -6
  11. package/dist/ddl/relation-ddl.d.ts +6 -6
  12. package/dist/ddl/relation-ddl.js +55 -48
  13. package/dist/ddl/relation-ddl.js.map +1 -6
  14. package/dist/ddl/schema-ddl.d.ts +4 -4
  15. package/dist/ddl/schema-ddl.js +21 -15
  16. package/dist/ddl/schema-ddl.js.map +1 -6
  17. package/dist/ddl/table-ddl.d.ts +20 -20
  18. package/dist/ddl/table-ddl.js +139 -93
  19. package/dist/ddl/table-ddl.js.map +1 -6
  20. package/dist/define-db-context.js +10 -13
  21. package/dist/define-db-context.js.map +1 -6
  22. package/dist/errors/db-transaction-error.d.ts +15 -15
  23. package/dist/errors/db-transaction-error.d.ts.map +1 -1
  24. package/dist/errors/db-transaction-error.js +53 -19
  25. package/dist/errors/db-transaction-error.js.map +1 -6
  26. package/dist/exec/executable.d.ts +23 -23
  27. package/dist/exec/executable.js +94 -40
  28. package/dist/exec/executable.js.map +1 -6
  29. package/dist/exec/queryable.d.ts +97 -97
  30. package/dist/exec/queryable.js +1310 -1204
  31. package/dist/exec/queryable.js.map +1 -6
  32. package/dist/exec/search-parser.d.ts +31 -31
  33. package/dist/exec/search-parser.d.ts.map +1 -1
  34. package/dist/exec/search-parser.js +158 -59
  35. package/dist/exec/search-parser.js.map +1 -6
  36. package/dist/expr/expr-unit.d.ts +4 -4
  37. package/dist/expr/expr-unit.js +24 -18
  38. package/dist/expr/expr-unit.js.map +1 -6
  39. package/dist/expr/expr.d.ts +108 -108
  40. package/dist/expr/expr.js +1872 -1844
  41. package/dist/expr/expr.js.map +1 -6
  42. package/dist/index.js +23 -1
  43. package/dist/index.js.map +1 -6
  44. package/dist/models/system-migration.js +7 -7
  45. package/dist/models/system-migration.js.map +1 -6
  46. package/dist/query-builder/base/expr-renderer-base.d.ts +10 -10
  47. package/dist/query-builder/base/expr-renderer-base.js +27 -21
  48. package/dist/query-builder/base/expr-renderer-base.js.map +1 -6
  49. package/dist/query-builder/base/query-builder-base.d.ts +21 -21
  50. package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
  51. package/dist/query-builder/base/query-builder-base.js +90 -80
  52. package/dist/query-builder/base/query-builder-base.js.map +1 -6
  53. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +5 -5
  54. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
  55. package/dist/query-builder/mssql/mssql-expr-renderer.js +447 -420
  56. package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -6
  57. package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
  58. package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
  59. package/dist/query-builder/mssql/mssql-query-builder.js +483 -443
  60. package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -6
  61. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +5 -5
  62. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
  63. package/dist/query-builder/mysql/mysql-expr-renderer.js +451 -419
  64. package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -6
  65. package/dist/query-builder/mysql/mysql-query-builder.d.ts +10 -10
  66. package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
  67. package/dist/query-builder/mysql/mysql-query-builder.js +570 -479
  68. package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -6
  69. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +5 -5
  70. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
  71. package/dist/query-builder/postgresql/postgresql-expr-renderer.js +449 -422
  72. package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -6
  73. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +8 -8
  74. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
  75. package/dist/query-builder/postgresql/postgresql-query-builder.js +511 -460
  76. package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -6
  77. package/dist/query-builder/query-builder.d.ts +1 -1
  78. package/dist/query-builder/query-builder.js +13 -13
  79. package/dist/query-builder/query-builder.js.map +1 -6
  80. package/dist/schema/factory/column-builder.d.ts +84 -84
  81. package/dist/schema/factory/column-builder.js +248 -185
  82. package/dist/schema/factory/column-builder.js.map +1 -6
  83. package/dist/schema/factory/index-builder.d.ts +38 -38
  84. package/dist/schema/factory/index-builder.js +144 -85
  85. package/dist/schema/factory/index-builder.js.map +1 -6
  86. package/dist/schema/factory/relation-builder.d.ts +99 -99
  87. package/dist/schema/factory/relation-builder.d.ts.map +1 -1
  88. package/dist/schema/factory/relation-builder.js +274 -136
  89. package/dist/schema/factory/relation-builder.js.map +1 -6
  90. package/dist/schema/procedure-builder.d.ts +51 -51
  91. package/dist/schema/procedure-builder.d.ts.map +1 -1
  92. package/dist/schema/procedure-builder.js +205 -131
  93. package/dist/schema/procedure-builder.js.map +1 -6
  94. package/dist/schema/table-builder.d.ts +55 -55
  95. package/dist/schema/table-builder.d.ts.map +1 -1
  96. package/dist/schema/table-builder.js +274 -205
  97. package/dist/schema/table-builder.js.map +1 -6
  98. package/dist/schema/view-builder.d.ts +44 -44
  99. package/dist/schema/view-builder.d.ts.map +1 -1
  100. package/dist/schema/view-builder.js +189 -116
  101. package/dist/schema/view-builder.js.map +1 -6
  102. package/dist/types/column.d.ts +21 -21
  103. package/dist/types/column.js +60 -30
  104. package/dist/types/column.js.map +1 -6
  105. package/dist/types/db-context-def.d.ts +9 -9
  106. package/dist/types/db-context-def.js +2 -1
  107. package/dist/types/db-context-def.js.map +1 -6
  108. package/dist/types/db.d.ts +47 -47
  109. package/dist/types/db.js +15 -5
  110. package/dist/types/db.js.map +1 -6
  111. package/dist/types/expr.d.ts +81 -81
  112. package/dist/types/expr.d.ts.map +1 -1
  113. package/dist/types/expr.js +3 -1
  114. package/dist/types/expr.js.map +1 -6
  115. package/dist/types/query-def.d.ts +46 -46
  116. package/dist/types/query-def.d.ts.map +1 -1
  117. package/dist/types/query-def.js +31 -24
  118. package/dist/types/query-def.js.map +1 -6
  119. package/dist/utils/result-parser.d.ts +11 -11
  120. package/dist/utils/result-parser.js +362 -221
  121. package/dist/utils/result-parser.js.map +1 -6
  122. package/docs/core.md +117 -145
  123. package/docs/expression.md +186 -203
  124. package/docs/query-builder.md +75 -42
  125. package/docs/queryable.md +189 -151
  126. package/docs/schema-builders.md +172 -283
  127. package/docs/types.md +229 -173
  128. package/package.json +7 -5
  129. package/src/create-db-context.ts +31 -31
  130. package/src/ddl/column-ddl.ts +4 -4
  131. package/src/ddl/initialize.ts +38 -38
  132. package/src/ddl/relation-ddl.ts +6 -6
  133. package/src/ddl/schema-ddl.ts +4 -4
  134. package/src/ddl/table-ddl.ts +24 -24
  135. package/src/errors/db-transaction-error.ts +13 -13
  136. package/src/exec/executable.ts +25 -25
  137. package/src/exec/queryable.ts +152 -152
  138. package/src/exec/search-parser.ts +50 -50
  139. package/src/expr/expr-unit.ts +4 -4
  140. package/src/expr/expr.ts +118 -118
  141. package/src/index.ts +8 -8
  142. package/src/models/system-migration.ts +1 -1
  143. package/src/query-builder/base/expr-renderer-base.ts +21 -21
  144. package/src/query-builder/base/query-builder-base.ts +33 -33
  145. package/src/query-builder/mssql/mssql-expr-renderer.ts +28 -28
  146. package/src/query-builder/mssql/mssql-query-builder.ts +37 -37
  147. package/src/query-builder/mysql/mysql-expr-renderer.ts +29 -29
  148. package/src/query-builder/mysql/mysql-query-builder.ts +70 -70
  149. package/src/query-builder/postgresql/postgresql-expr-renderer.ts +22 -22
  150. package/src/query-builder/postgresql/postgresql-query-builder.ts +54 -54
  151. package/src/query-builder/query-builder.ts +1 -1
  152. package/src/schema/factory/column-builder.ts +86 -86
  153. package/src/schema/factory/index-builder.ts +38 -38
  154. package/src/schema/factory/relation-builder.ts +102 -102
  155. package/src/schema/procedure-builder.ts +52 -52
  156. package/src/schema/table-builder.ts +56 -56
  157. package/src/schema/view-builder.ts +47 -47
  158. package/src/types/column.ts +24 -24
  159. package/src/types/db-context-def.ts +15 -15
  160. package/src/types/db.ts +50 -50
  161. package/src/types/expr.ts +103 -103
  162. package/src/types/query-def.ts +50 -50
  163. package/src/utils/result-parser.ts +88 -88
  164. package/docs/utilities.md +0 -27
  165. package/tests/db-context/create-db-context.spec.ts +0 -193
  166. package/tests/db-context/define-db-context.spec.ts +0 -17
  167. package/tests/ddl/basic.expected.ts +0 -341
  168. package/tests/ddl/basic.spec.ts +0 -557
  169. package/tests/ddl/column-builder.expected.ts +0 -310
  170. package/tests/ddl/column-builder.spec.ts +0 -525
  171. package/tests/ddl/index-builder.expected.ts +0 -38
  172. package/tests/ddl/index-builder.spec.ts +0 -148
  173. package/tests/ddl/procedure-builder.expected.ts +0 -52
  174. package/tests/ddl/procedure-builder.spec.ts +0 -128
  175. package/tests/ddl/relation-builder.expected.ts +0 -36
  176. package/tests/ddl/relation-builder.spec.ts +0 -171
  177. package/tests/ddl/table-builder.expected.ts +0 -113
  178. package/tests/ddl/table-builder.spec.ts +0 -399
  179. package/tests/ddl/view-builder.expected.ts +0 -38
  180. package/tests/ddl/view-builder.spec.ts +0 -116
  181. package/tests/dml/delete.expected.ts +0 -96
  182. package/tests/dml/delete.spec.ts +0 -127
  183. package/tests/dml/insert.expected.ts +0 -192
  184. package/tests/dml/insert.spec.ts +0 -210
  185. package/tests/dml/update.expected.ts +0 -176
  186. package/tests/dml/update.spec.ts +0 -222
  187. package/tests/dml/upsert.expected.ts +0 -215
  188. package/tests/dml/upsert.spec.ts +0 -190
  189. package/tests/errors/queryable-errors.spec.ts +0 -126
  190. package/tests/escape.spec.ts +0 -59
  191. package/tests/examples/pivot.expected.ts +0 -211
  192. package/tests/examples/pivot.spec.ts +0 -200
  193. package/tests/examples/sampling.expected.ts +0 -69
  194. package/tests/examples/sampling.spec.ts +0 -42
  195. package/tests/examples/unpivot.expected.ts +0 -120
  196. package/tests/examples/unpivot.spec.ts +0 -161
  197. package/tests/exec/search-parser.spec.ts +0 -267
  198. package/tests/executable/basic.expected.ts +0 -18
  199. package/tests/executable/basic.spec.ts +0 -54
  200. package/tests/expr/comparison.expected.ts +0 -282
  201. package/tests/expr/comparison.spec.ts +0 -334
  202. package/tests/expr/conditional.expected.ts +0 -134
  203. package/tests/expr/conditional.spec.ts +0 -249
  204. package/tests/expr/date.expected.ts +0 -332
  205. package/tests/expr/date.spec.ts +0 -459
  206. package/tests/expr/math.expected.ts +0 -62
  207. package/tests/expr/math.spec.ts +0 -59
  208. package/tests/expr/string.expected.ts +0 -218
  209. package/tests/expr/string.spec.ts +0 -300
  210. package/tests/expr/utility.expected.ts +0 -147
  211. package/tests/expr/utility.spec.ts +0 -155
  212. package/tests/select/basic.expected.ts +0 -322
  213. package/tests/select/basic.spec.ts +0 -433
  214. package/tests/select/filter.expected.ts +0 -357
  215. package/tests/select/filter.spec.ts +0 -954
  216. package/tests/select/group.expected.ts +0 -169
  217. package/tests/select/group.spec.ts +0 -159
  218. package/tests/select/join.expected.ts +0 -582
  219. package/tests/select/join.spec.ts +0 -692
  220. package/tests/select/order.expected.ts +0 -150
  221. package/tests/select/order.spec.ts +0 -140
  222. package/tests/select/recursive-cte.expected.ts +0 -244
  223. package/tests/select/recursive-cte.spec.ts +0 -514
  224. package/tests/select/result-meta.spec.ts +0 -270
  225. package/tests/select/subquery.expected.ts +0 -363
  226. package/tests/select/subquery.spec.ts +0 -441
  227. package/tests/select/view.expected.ts +0 -155
  228. package/tests/select/view.spec.ts +0 -235
  229. package/tests/select/window.expected.ts +0 -345
  230. package/tests/select/window.spec.ts +0 -433
  231. package/tests/setup/MockExecutor.ts +0 -18
  232. package/tests/setup/TestDbContext.ts +0 -59
  233. package/tests/setup/models/Company.ts +0 -13
  234. package/tests/setup/models/Employee.ts +0 -10
  235. package/tests/setup/models/MonthlySales.ts +0 -11
  236. package/tests/setup/models/Post.ts +0 -16
  237. package/tests/setup/models/Sales.ts +0 -10
  238. package/tests/setup/models/User.ts +0 -19
  239. package/tests/setup/procedure/GetAllUsers.ts +0 -9
  240. package/tests/setup/procedure/GetUserById.ts +0 -12
  241. package/tests/setup/test-utils.ts +0 -72
  242. package/tests/setup/views/ActiveUsers.ts +0 -8
  243. package/tests/setup/views/UserSummary.ts +0 -11
  244. package/tests/types/nullable-queryable-record.spec.ts +0 -97
  245. package/tests/utils/result-parser-perf.spec.ts +0 -143
  246. package/tests/utils/result-parser.spec.ts +0 -667
@@ -1,169 +0,0 @@
1
- /**
2
- * SELECT - GROUP BY / HAVING test expected SQL
3
- */
4
- import { mysql, pgsql, tsql } from "@simplysm/core-common";
5
- import type { ExpectedSql } from "../setup/test-utils";
6
-
7
- //#region ========== GROUP BY ==========
8
-
9
- export const groupSingle: ExpectedSql = {
10
- mysql: mysql`
11
- SELECT \`T1\`.\`name\` AS \`name\`, COUNT(\`T1\`.\`id\`) AS \`cnt\`
12
- FROM \`TestDb\`.\`User\` AS \`T1\`
13
- GROUP BY \`T1\`.\`name\`
14
- `,
15
- mssql: tsql`
16
- SELECT [T1].[name] AS [name], COUNT([T1].[id]) AS [cnt]
17
- FROM [TestDb].[TestSchema].[User] AS [T1]
18
- GROUP BY [T1].[name]
19
- `,
20
- postgresql: pgsql`
21
- SELECT "T1"."name" AS "name", COUNT("T1"."id") AS "cnt"
22
- FROM "TestSchema"."User" AS "T1"
23
- GROUP BY "T1"."name"
24
- `,
25
- };
26
-
27
- export const groupMultiple: ExpectedSql = {
28
- mysql: mysql`
29
- SELECT
30
- \`T1\`.\`name\` AS \`name\`,
31
- \`T1\`.\`isActive\` AS \`isActive\`,
32
- COUNT(\`T1\`.\`id\`) AS \`cnt\`
33
- FROM \`TestDb\`.\`User\` AS \`T1\`
34
- GROUP BY \`T1\`.\`name\`, \`T1\`.\`isActive\`
35
- `,
36
- mssql: tsql`
37
- SELECT
38
- [T1].[name] AS [name],
39
- [T1].[isActive] AS [isActive],
40
- COUNT([T1].[id]) AS [cnt]
41
- FROM [TestDb].[TestSchema].[User] AS [T1]
42
- GROUP BY [T1].[name], [T1].[isActive]
43
- `,
44
- postgresql: pgsql`
45
- SELECT
46
- "T1"."name" AS "name",
47
- "T1"."isActive" AS "isActive",
48
- COUNT("T1"."id") AS "cnt"
49
- FROM "TestSchema"."User" AS "T1"
50
- GROUP BY "T1"."name", "T1"."isActive"
51
- `,
52
- };
53
-
54
- export const groupAggregate: ExpectedSql = {
55
- mysql: mysql`
56
- SELECT
57
- \`T1\`.\`name\` AS \`name\`,
58
- COUNT(\`T1\`.\`id\`) AS \`cnt\`,
59
- SUM(\`T1\`.\`age\`) AS \`sumAge\`,
60
- AVG(\`T1\`.\`age\`) AS \`avgAge\`,
61
- MIN(\`T1\`.\`age\`) AS \`minAge\`,
62
- MAX(\`T1\`.\`age\`) AS \`maxAge\`
63
- FROM \`TestDb\`.\`User\` AS \`T1\`
64
- GROUP BY \`T1\`.\`name\`
65
- `,
66
- mssql: tsql`
67
- SELECT
68
- [T1].[name] AS [name],
69
- COUNT([T1].[id]) AS [cnt],
70
- SUM([T1].[age]) AS [sumAge],
71
- AVG([T1].[age]) AS [avgAge],
72
- MIN([T1].[age]) AS [minAge],
73
- MAX([T1].[age]) AS [maxAge]
74
- FROM [TestDb].[TestSchema].[User] AS [T1]
75
- GROUP BY [T1].[name]
76
- `,
77
- postgresql: pgsql`
78
- SELECT
79
- "T1"."name" AS "name",
80
- COUNT("T1"."id") AS "cnt",
81
- SUM("T1"."age") AS "sumAge",
82
- AVG("T1"."age") AS "avgAge",
83
- MIN("T1"."age") AS "minAge",
84
- MAX("T1"."age") AS "maxAge"
85
- FROM "TestSchema"."User" AS "T1"
86
- GROUP BY "T1"."name"
87
- `,
88
- };
89
-
90
- //#endregion
91
-
92
- //#region ========== HAVING ==========
93
-
94
- export const havingSingle: ExpectedSql = {
95
- mysql: mysql`
96
- SELECT \`T1\`.\`name\` AS \`name\`, COUNT(\`T1\`.\`id\`) AS \`cnt\`
97
- FROM \`TestDb\`.\`User\` AS \`T1\`
98
- GROUP BY \`T1\`.\`name\`
99
- HAVING COUNT(\`T1\`.\`id\`) > 5
100
- `,
101
- mssql: tsql`
102
- SELECT [T1].[name] AS [name], COUNT([T1].[id]) AS [cnt]
103
- FROM [TestDb].[TestSchema].[User] AS [T1]
104
- GROUP BY [T1].[name]
105
- HAVING COUNT([T1].[id]) > 5
106
- `,
107
- postgresql: pgsql`
108
- SELECT "T1"."name" AS "name", COUNT("T1"."id") AS "cnt"
109
- FROM "TestSchema"."User" AS "T1"
110
- GROUP BY "T1"."name"
111
- HAVING COUNT("T1"."id") > 5
112
- `,
113
- };
114
-
115
- export const havingMultiple: ExpectedSql = {
116
- mysql: mysql`
117
- SELECT
118
- \`T1\`.\`name\` AS \`name\`,
119
- COUNT(\`T1\`.\`id\`) AS \`cnt\`,
120
- AVG(\`T1\`.\`age\`) AS \`avgAge\`
121
- FROM \`TestDb\`.\`User\` AS \`T1\`
122
- GROUP BY \`T1\`.\`name\`
123
- HAVING COUNT(\`T1\`.\`id\`) > 5 AND AVG(\`T1\`.\`age\`) >= 25
124
- `,
125
- mssql: tsql`
126
- SELECT
127
- [T1].[name] AS [name],
128
- COUNT([T1].[id]) AS [cnt],
129
- AVG([T1].[age]) AS [avgAge]
130
- FROM [TestDb].[TestSchema].[User] AS [T1]
131
- GROUP BY [T1].[name]
132
- HAVING COUNT([T1].[id]) > 5 AND AVG([T1].[age]) >= 25
133
- `,
134
- postgresql: pgsql`
135
- SELECT
136
- "T1"."name" AS "name",
137
- COUNT("T1"."id") AS "cnt",
138
- AVG("T1"."age") AS "avgAge"
139
- FROM "TestSchema"."User" AS "T1"
140
- GROUP BY "T1"."name"
141
- HAVING COUNT("T1"."id") > 5 AND AVG("T1"."age") >= 25
142
- `,
143
- };
144
-
145
- export const havingOrderCombo: ExpectedSql = {
146
- mysql: mysql`
147
- SELECT \`T1\`.\`name\` AS \`name\`, COUNT(\`T1\`.\`id\`) AS \`cnt\`
148
- FROM \`TestDb\`.\`User\` AS \`T1\`
149
- GROUP BY \`T1\`.\`name\`
150
- HAVING COUNT(\`T1\`.\`id\`) > 1
151
- ORDER BY COUNT(\`T1\`.\`id\`) DESC
152
- `,
153
- mssql: tsql`
154
- SELECT [T1].[name] AS [name], COUNT([T1].[id]) AS [cnt]
155
- FROM [TestDb].[TestSchema].[User] AS [T1]
156
- GROUP BY [T1].[name]
157
- HAVING COUNT([T1].[id]) > 1
158
- ORDER BY COUNT([T1].[id]) DESC
159
- `,
160
- postgresql: pgsql`
161
- SELECT "T1"."name" AS "name", COUNT("T1"."id") AS "cnt"
162
- FROM "TestSchema"."User" AS "T1"
163
- GROUP BY "T1"."name"
164
- HAVING COUNT("T1"."id") > 1
165
- ORDER BY COUNT("T1"."id") DESC
166
- `,
167
- };
168
-
169
- //#endregion
@@ -1,159 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { createTestDb } from "../setup/TestDbContext";
3
- import { expr } from "../../src/expr/expr";
4
- import { createQueryBuilder } from "../../src/query-builder/query-builder";
5
- import { dialects } from "../setup/test-utils";
6
- import * as expected from "./group.expected";
7
-
8
- describe("SELECT - GROUP BY", () => {
9
- //#region ========== Basic GROUP BY ==========
10
-
11
- describe("single column", () => {
12
- const db = createTestDb();
13
- const def = db
14
- .user()
15
- .select((item) => ({
16
- name: item.name,
17
- cnt: expr.count(item.id),
18
- }))
19
- .groupBy((item) => [item.name])
20
- .getSelectQueryDef();
21
-
22
- it("Verify QueryDef", () => {
23
- expect(def).toEqual({
24
- type: "select",
25
- as: "T1",
26
- from: { database: "TestDb", schema: "TestSchema", name: "User" },
27
- select: {
28
- name: { type: "column", path: ["T1", "name"] },
29
- cnt: { type: "count", arg: { type: "column", path: ["T1", "id"] } },
30
- },
31
- groupBy: [{ type: "column", path: ["T1", "name"] }],
32
- });
33
- });
34
-
35
- it.each(dialects)("[%s] Verify SQL", (dialect) => {
36
- const builder = createQueryBuilder(dialect);
37
- expect(builder.build(def)).toMatchSql(expected.groupSingle[dialect]);
38
- });
39
- });
40
-
41
- describe("multiple columns", () => {
42
- const db = createTestDb();
43
- const def = db
44
- .user()
45
- .select((item) => ({
46
- name: item.name,
47
- isActive: item.isActive,
48
- cnt: expr.count(item.id),
49
- }))
50
- .groupBy((item) => [item.name, item.isActive])
51
- .getSelectQueryDef();
52
-
53
- it("Verify QueryDef", () => {
54
- expect(def).toEqual({
55
- type: "select",
56
- as: "T1",
57
- from: { database: "TestDb", schema: "TestSchema", name: "User" },
58
- select: {
59
- name: { type: "column", path: ["T1", "name"] },
60
- isActive: { type: "column", path: ["T1", "isActive"] },
61
- cnt: { type: "count", arg: { type: "column", path: ["T1", "id"] } },
62
- },
63
- groupBy: [
64
- { type: "column", path: ["T1", "name"] },
65
- { type: "column", path: ["T1", "isActive"] },
66
- ],
67
- });
68
- });
69
-
70
- it.each(dialects)("[%s] Verify SQL", (dialect) => {
71
- const builder = createQueryBuilder(dialect);
72
- expect(builder.build(def)).toMatchSql(expected.groupMultiple[dialect]);
73
- });
74
- });
75
-
76
- describe("aggregate functions", () => {
77
- const db = createTestDb();
78
- const def = db
79
- .user()
80
- .select((item) => ({
81
- name: item.name,
82
- cnt: expr.count(item.id),
83
- sumAge: expr.sum(item.age),
84
- avgAge: expr.avg(item.age),
85
- minAge: expr.min(item.age),
86
- maxAge: expr.max(item.age),
87
- }))
88
- .groupBy((item) => [item.name])
89
- .getSelectQueryDef();
90
-
91
- it("Verify QueryDef", () => {
92
- expect(def).toEqual({
93
- type: "select",
94
- as: "T1",
95
- from: { database: "TestDb", schema: "TestSchema", name: "User" },
96
- select: {
97
- name: { type: "column", path: ["T1", "name"] },
98
- cnt: { type: "count", arg: { type: "column", path: ["T1", "id"] } },
99
- sumAge: { type: "sum", arg: { type: "column", path: ["T1", "age"] } },
100
- avgAge: { type: "avg", arg: { type: "column", path: ["T1", "age"] } },
101
- minAge: { type: "min", arg: { type: "column", path: ["T1", "age"] } },
102
- maxAge: { type: "max", arg: { type: "column", path: ["T1", "age"] } },
103
- },
104
- groupBy: [{ type: "column", path: ["T1", "name"] }],
105
- });
106
- });
107
-
108
- it.each(dialects)("[%s] Verify SQL", (dialect) => {
109
- const builder = createQueryBuilder(dialect);
110
- expect(builder.build(def)).toMatchSql(expected.groupAggregate[dialect]);
111
- });
112
- });
113
-
114
- //#endregion
115
- });
116
-
117
- describe("SELECT - HAVING", () => {
118
- //#region ========== HAVING ==========
119
-
120
- describe("single condition", () => {
121
- const db = createTestDb();
122
- const def = db
123
- .user()
124
- .select((item) => ({
125
- name: item.name,
126
- cnt: expr.count(item.id),
127
- }))
128
- .groupBy((item) => [item.name])
129
- .having((item) => [expr.gt(item.cnt, 5)])
130
- .getSelectQueryDef();
131
-
132
- it("Verify QueryDef", () => {
133
- expect(def).toEqual({
134
- type: "select",
135
- as: "T1",
136
- from: { database: "TestDb", schema: "TestSchema", name: "User" },
137
- select: {
138
- name: { type: "column", path: ["T1", "name"] },
139
- cnt: { type: "count", arg: { type: "column", path: ["T1", "id"] } },
140
- },
141
- groupBy: [{ type: "column", path: ["T1", "name"] }],
142
- having: [
143
- {
144
- type: "gt",
145
- source: { type: "count", arg: { type: "column", path: ["T1", "id"] } },
146
- target: { type: "value", value: 5 },
147
- },
148
- ],
149
- });
150
- });
151
-
152
- it.each(dialects)("[%s] Verify SQL", (dialect) => {
153
- const builder = createQueryBuilder(dialect);
154
- expect(builder.build(def)).toMatchSql(expected.havingSingle[dialect]);
155
- });
156
- });
157
-
158
- //#endregion
159
- });