@simplysm/orm-common 13.0.99 → 14.0.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 (238) hide show
  1. package/dist/create-db-context.d.ts +10 -10
  2. package/dist/create-db-context.js +312 -276
  3. package/dist/create-db-context.js.map +1 -6
  4. package/dist/ddl/column-ddl.d.ts +4 -4
  5. package/dist/ddl/column-ddl.js +41 -35
  6. package/dist/ddl/column-ddl.js.map +1 -6
  7. package/dist/ddl/initialize.d.ts +17 -17
  8. package/dist/ddl/initialize.js +200 -142
  9. package/dist/ddl/initialize.js.map +1 -6
  10. package/dist/ddl/relation-ddl.d.ts +6 -6
  11. package/dist/ddl/relation-ddl.js +55 -48
  12. package/dist/ddl/relation-ddl.js.map +1 -6
  13. package/dist/ddl/schema-ddl.d.ts +4 -4
  14. package/dist/ddl/schema-ddl.js +21 -15
  15. package/dist/ddl/schema-ddl.js.map +1 -6
  16. package/dist/ddl/table-ddl.d.ts +20 -20
  17. package/dist/ddl/table-ddl.js +139 -93
  18. package/dist/ddl/table-ddl.js.map +1 -6
  19. package/dist/define-db-context.js +10 -13
  20. package/dist/define-db-context.js.map +1 -6
  21. package/dist/errors/db-transaction-error.d.ts +15 -15
  22. package/dist/errors/db-transaction-error.d.ts.map +1 -1
  23. package/dist/errors/db-transaction-error.js +53 -19
  24. package/dist/errors/db-transaction-error.js.map +1 -6
  25. package/dist/exec/executable.d.ts +23 -23
  26. package/dist/exec/executable.js +94 -40
  27. package/dist/exec/executable.js.map +1 -6
  28. package/dist/exec/queryable.d.ts +97 -97
  29. package/dist/exec/queryable.js +1310 -1204
  30. package/dist/exec/queryable.js.map +1 -6
  31. package/dist/exec/search-parser.d.ts +31 -31
  32. package/dist/exec/search-parser.d.ts.map +1 -1
  33. package/dist/exec/search-parser.js +158 -59
  34. package/dist/exec/search-parser.js.map +1 -6
  35. package/dist/expr/expr-unit.d.ts +4 -4
  36. package/dist/expr/expr-unit.js +24 -18
  37. package/dist/expr/expr-unit.js.map +1 -6
  38. package/dist/expr/expr.d.ts +6 -6
  39. package/dist/expr/expr.js +1872 -1844
  40. package/dist/expr/expr.js.map +1 -6
  41. package/dist/index.js +23 -1
  42. package/dist/index.js.map +1 -6
  43. package/dist/models/system-migration.js +7 -7
  44. package/dist/models/system-migration.js.map +1 -6
  45. package/dist/query-builder/base/expr-renderer-base.d.ts +10 -10
  46. package/dist/query-builder/base/expr-renderer-base.js +27 -21
  47. package/dist/query-builder/base/expr-renderer-base.js.map +1 -6
  48. package/dist/query-builder/base/query-builder-base.d.ts +21 -21
  49. package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
  50. package/dist/query-builder/base/query-builder-base.js +90 -80
  51. package/dist/query-builder/base/query-builder-base.js.map +1 -6
  52. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
  53. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
  54. package/dist/query-builder/mssql/mssql-expr-renderer.js +447 -420
  55. package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -6
  56. package/dist/query-builder/mssql/mssql-query-builder.js +483 -443
  57. package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -6
  58. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
  59. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
  60. package/dist/query-builder/mysql/mysql-expr-renderer.js +451 -419
  61. package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -6
  62. package/dist/query-builder/mysql/mysql-query-builder.js +570 -479
  63. package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -6
  64. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
  65. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
  66. package/dist/query-builder/postgresql/postgresql-expr-renderer.js +449 -422
  67. package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -6
  68. package/dist/query-builder/postgresql/postgresql-query-builder.js +511 -460
  69. package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -6
  70. package/dist/query-builder/query-builder.d.ts +1 -1
  71. package/dist/query-builder/query-builder.js +13 -13
  72. package/dist/query-builder/query-builder.js.map +1 -6
  73. package/dist/schema/factory/column-builder.d.ts +84 -84
  74. package/dist/schema/factory/column-builder.js +248 -185
  75. package/dist/schema/factory/column-builder.js.map +1 -6
  76. package/dist/schema/factory/index-builder.d.ts +38 -38
  77. package/dist/schema/factory/index-builder.js +144 -85
  78. package/dist/schema/factory/index-builder.js.map +1 -6
  79. package/dist/schema/factory/relation-builder.d.ts +91 -91
  80. package/dist/schema/factory/relation-builder.d.ts.map +1 -1
  81. package/dist/schema/factory/relation-builder.js +274 -136
  82. package/dist/schema/factory/relation-builder.js.map +1 -6
  83. package/dist/schema/procedure-builder.d.ts +51 -51
  84. package/dist/schema/procedure-builder.d.ts.map +1 -1
  85. package/dist/schema/procedure-builder.js +205 -131
  86. package/dist/schema/procedure-builder.js.map +1 -6
  87. package/dist/schema/table-builder.d.ts +55 -55
  88. package/dist/schema/table-builder.d.ts.map +1 -1
  89. package/dist/schema/table-builder.js +274 -205
  90. package/dist/schema/table-builder.js.map +1 -6
  91. package/dist/schema/view-builder.d.ts +44 -44
  92. package/dist/schema/view-builder.d.ts.map +1 -1
  93. package/dist/schema/view-builder.js +189 -116
  94. package/dist/schema/view-builder.js.map +1 -6
  95. package/dist/types/column.js +60 -30
  96. package/dist/types/column.js.map +1 -6
  97. package/dist/types/db-context-def.d.ts +9 -9
  98. package/dist/types/db-context-def.js +2 -1
  99. package/dist/types/db-context-def.js.map +1 -6
  100. package/dist/types/db.d.ts +47 -47
  101. package/dist/types/db.js +15 -5
  102. package/dist/types/db.js.map +1 -6
  103. package/dist/types/expr.d.ts +81 -81
  104. package/dist/types/expr.d.ts.map +1 -1
  105. package/dist/types/expr.js +3 -1
  106. package/dist/types/expr.js.map +1 -6
  107. package/dist/types/query-def.d.ts +46 -46
  108. package/dist/types/query-def.d.ts.map +1 -1
  109. package/dist/types/query-def.js +31 -24
  110. package/dist/types/query-def.js.map +1 -6
  111. package/dist/utils/result-parser.js +362 -221
  112. package/dist/utils/result-parser.js.map +1 -6
  113. package/package.json +5 -7
  114. package/src/create-db-context.ts +31 -31
  115. package/src/ddl/column-ddl.ts +4 -4
  116. package/src/ddl/initialize.ts +38 -38
  117. package/src/ddl/relation-ddl.ts +6 -6
  118. package/src/ddl/schema-ddl.ts +4 -4
  119. package/src/ddl/table-ddl.ts +24 -24
  120. package/src/errors/db-transaction-error.ts +13 -13
  121. package/src/exec/executable.ts +25 -25
  122. package/src/exec/queryable.ts +134 -134
  123. package/src/exec/search-parser.ts +50 -50
  124. package/src/expr/expr-unit.ts +4 -4
  125. package/src/expr/expr.ts +13 -13
  126. package/src/index.ts +8 -8
  127. package/src/models/system-migration.ts +1 -1
  128. package/src/query-builder/base/expr-renderer-base.ts +21 -21
  129. package/src/query-builder/base/query-builder-base.ts +33 -33
  130. package/src/query-builder/mssql/mssql-expr-renderer.ts +11 -11
  131. package/src/query-builder/mssql/mssql-query-builder.ts +11 -11
  132. package/src/query-builder/mysql/mysql-expr-renderer.ts +15 -15
  133. package/src/query-builder/mysql/mysql-query-builder.ts +3 -3
  134. package/src/query-builder/postgresql/postgresql-expr-renderer.ts +9 -9
  135. package/src/query-builder/postgresql/postgresql-query-builder.ts +7 -7
  136. package/src/query-builder/query-builder.ts +1 -1
  137. package/src/schema/factory/column-builder.ts +86 -86
  138. package/src/schema/factory/index-builder.ts +38 -38
  139. package/src/schema/factory/relation-builder.ts +93 -93
  140. package/src/schema/procedure-builder.ts +52 -52
  141. package/src/schema/table-builder.ts +56 -56
  142. package/src/schema/view-builder.ts +45 -45
  143. package/src/types/column.ts +1 -1
  144. package/src/types/db-context-def.ts +15 -15
  145. package/src/types/db.ts +50 -50
  146. package/src/types/expr.ts +103 -103
  147. package/src/types/query-def.ts +50 -50
  148. package/src/utils/result-parser.ts +39 -39
  149. package/README.md +0 -192
  150. package/docs/core.md +0 -234
  151. package/docs/expression.md +0 -234
  152. package/docs/query-builder.md +0 -93
  153. package/docs/queryable.md +0 -198
  154. package/docs/schema-builders.md +0 -463
  155. package/docs/types.md +0 -445
  156. package/docs/utilities.md +0 -27
  157. package/tests/db-context/create-db-context.spec.ts +0 -193
  158. package/tests/db-context/define-db-context.spec.ts +0 -17
  159. package/tests/ddl/basic.expected.ts +0 -341
  160. package/tests/ddl/basic.spec.ts +0 -557
  161. package/tests/ddl/column-builder.expected.ts +0 -310
  162. package/tests/ddl/column-builder.spec.ts +0 -525
  163. package/tests/ddl/index-builder.expected.ts +0 -38
  164. package/tests/ddl/index-builder.spec.ts +0 -148
  165. package/tests/ddl/procedure-builder.expected.ts +0 -52
  166. package/tests/ddl/procedure-builder.spec.ts +0 -128
  167. package/tests/ddl/relation-builder.expected.ts +0 -36
  168. package/tests/ddl/relation-builder.spec.ts +0 -171
  169. package/tests/ddl/table-builder.expected.ts +0 -113
  170. package/tests/ddl/table-builder.spec.ts +0 -399
  171. package/tests/ddl/view-builder.expected.ts +0 -38
  172. package/tests/ddl/view-builder.spec.ts +0 -116
  173. package/tests/dml/delete.expected.ts +0 -96
  174. package/tests/dml/delete.spec.ts +0 -127
  175. package/tests/dml/insert.expected.ts +0 -192
  176. package/tests/dml/insert.spec.ts +0 -210
  177. package/tests/dml/update.expected.ts +0 -176
  178. package/tests/dml/update.spec.ts +0 -222
  179. package/tests/dml/upsert.expected.ts +0 -215
  180. package/tests/dml/upsert.spec.ts +0 -190
  181. package/tests/errors/queryable-errors.spec.ts +0 -126
  182. package/tests/escape.spec.ts +0 -59
  183. package/tests/examples/pivot.expected.ts +0 -211
  184. package/tests/examples/pivot.spec.ts +0 -200
  185. package/tests/examples/sampling.expected.ts +0 -69
  186. package/tests/examples/sampling.spec.ts +0 -42
  187. package/tests/examples/unpivot.expected.ts +0 -120
  188. package/tests/examples/unpivot.spec.ts +0 -161
  189. package/tests/exec/search-parser.spec.ts +0 -267
  190. package/tests/executable/basic.expected.ts +0 -18
  191. package/tests/executable/basic.spec.ts +0 -54
  192. package/tests/expr/comparison.expected.ts +0 -282
  193. package/tests/expr/comparison.spec.ts +0 -334
  194. package/tests/expr/conditional.expected.ts +0 -134
  195. package/tests/expr/conditional.spec.ts +0 -249
  196. package/tests/expr/date.expected.ts +0 -332
  197. package/tests/expr/date.spec.ts +0 -459
  198. package/tests/expr/math.expected.ts +0 -62
  199. package/tests/expr/math.spec.ts +0 -59
  200. package/tests/expr/string.expected.ts +0 -218
  201. package/tests/expr/string.spec.ts +0 -300
  202. package/tests/expr/utility.expected.ts +0 -147
  203. package/tests/expr/utility.spec.ts +0 -155
  204. package/tests/select/basic.expected.ts +0 -322
  205. package/tests/select/basic.spec.ts +0 -433
  206. package/tests/select/filter.expected.ts +0 -357
  207. package/tests/select/filter.spec.ts +0 -954
  208. package/tests/select/group.expected.ts +0 -169
  209. package/tests/select/group.spec.ts +0 -159
  210. package/tests/select/join.expected.ts +0 -582
  211. package/tests/select/join.spec.ts +0 -692
  212. package/tests/select/order.expected.ts +0 -150
  213. package/tests/select/order.spec.ts +0 -140
  214. package/tests/select/recursive-cte.expected.ts +0 -244
  215. package/tests/select/recursive-cte.spec.ts +0 -514
  216. package/tests/select/result-meta.spec.ts +0 -270
  217. package/tests/select/subquery.expected.ts +0 -363
  218. package/tests/select/subquery.spec.ts +0 -441
  219. package/tests/select/view.expected.ts +0 -155
  220. package/tests/select/view.spec.ts +0 -235
  221. package/tests/select/window.expected.ts +0 -345
  222. package/tests/select/window.spec.ts +0 -433
  223. package/tests/setup/MockExecutor.ts +0 -18
  224. package/tests/setup/TestDbContext.ts +0 -59
  225. package/tests/setup/models/Company.ts +0 -13
  226. package/tests/setup/models/Employee.ts +0 -10
  227. package/tests/setup/models/MonthlySales.ts +0 -11
  228. package/tests/setup/models/Post.ts +0 -16
  229. package/tests/setup/models/Sales.ts +0 -10
  230. package/tests/setup/models/User.ts +0 -19
  231. package/tests/setup/procedure/GetAllUsers.ts +0 -9
  232. package/tests/setup/procedure/GetUserById.ts +0 -12
  233. package/tests/setup/test-utils.ts +0 -72
  234. package/tests/setup/views/ActiveUsers.ts +0 -8
  235. package/tests/setup/views/UserSummary.ts +0 -11
  236. package/tests/types/nullable-queryable-record.spec.ts +0 -97
  237. package/tests/utils/result-parser-perf.spec.ts +0 -143
  238. package/tests/utils/result-parser.spec.ts +0 -667
@@ -1,514 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { createTestDb } from "../setup/TestDbContext";
3
- import { expr } from "../../src/expr/expr";
4
- import { Employee } from "../setup/models/Employee";
5
- import { createQueryBuilder } from "../../src/query-builder/query-builder";
6
- import { dialects } from "../setup/test-utils";
7
- import "../setup/test-utils"; // toMatchSql matcher
8
- import * as expected from "./recursive-cte.expected";
9
-
10
- describe("SELECT - Recursive CTE", () => {
11
- describe("Basic: select all subordinates of a specific manager", () => {
12
- const db = createTestDb();
13
- const def = db
14
- .employee()
15
- .where((e) => [expr.eq(e.managerId, 1)])
16
- .select((e) => ({
17
- id: e.id,
18
- name: e.name,
19
- managerId: e.managerId,
20
- depth: expr.val("number", 1),
21
- }))
22
- .recursive((qr) => {
23
- return qr
24
- .from(Employee)
25
- .where((e) => [expr.eq(e.managerId, e.self![0].id)])
26
- .select((e) => ({
27
- id: e.id,
28
- name: e.name,
29
- managerId: e.managerId,
30
- depth: expr.raw("number")`${e.self![0].depth} + 1`.n,
31
- }));
32
- })
33
- .select((s) => ({
34
- id: s.id,
35
- name: s.name,
36
- managerId: s.managerId,
37
- depth: s.depth,
38
- }))
39
- .getSelectQueryDef();
40
-
41
- it("Verify QueryDef", () => {
42
- expect(def).toEqual({
43
- type: "select",
44
- as: "T1",
45
- from: "T2",
46
- with: {
47
- name: "T2",
48
- base: {
49
- type: "select",
50
- as: "T1",
51
- from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
52
- where: [
53
- {
54
- type: "eq",
55
- source: { type: "column", path: ["T1", "managerId"] },
56
- target: { type: "value", value: 1 },
57
- },
58
- ],
59
- select: {
60
- id: { type: "column", path: ["T1", "id"] },
61
- name: { type: "column", path: ["T1", "name"] },
62
- managerId: { type: "column", path: ["T1", "managerId"] },
63
- depth: { type: "value", value: 1 },
64
- },
65
- },
66
- recursive: {
67
- type: "select",
68
- as: "T2",
69
- from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
70
- joins: [
71
- {
72
- type: "select",
73
- as: "T2.self",
74
- from: "T2",
75
- isSingle: false,
76
- },
77
- ],
78
- where: [
79
- {
80
- type: "eq",
81
- source: { type: "column", path: ["T2", "managerId"] },
82
- target: { type: "column", path: ["T2.self", "id"] },
83
- },
84
- ],
85
- select: {
86
- id: { type: "column", path: ["T2", "id"] },
87
- name: { type: "column", path: ["T2", "name"] },
88
- managerId: { type: "column", path: ["T2", "managerId"] },
89
- depth: {
90
- type: "raw",
91
- sql: "$1 + 1",
92
- params: [{ type: "column", path: ["T2.self", "depth"] }],
93
- },
94
- },
95
- },
96
- },
97
- select: {
98
- id: { type: "column", path: ["T1", "id"] },
99
- name: { type: "column", path: ["T1", "name"] },
100
- managerId: { type: "column", path: ["T1", "managerId"] },
101
- depth: { type: "column", path: ["T1", "depth"] },
102
- },
103
- });
104
- });
105
-
106
- it.each(dialects)("[%s] Verify SQL", (dialect) => {
107
- const builder = createQueryBuilder(dialect);
108
- expect(builder.build(def)).toMatchSql(expected.basicSubordinates[dialect]);
109
- });
110
- });
111
-
112
- describe("depth limit: check depth in recursive WHERE", () => {
113
- const db = createTestDb();
114
- const def = db
115
- .employee()
116
- .where((e) => [expr.eq(e.managerId, 1)])
117
- .select((e) => ({
118
- id: e.id,
119
- name: e.name,
120
- depth: expr.val("number", 1),
121
- }))
122
- .recursive((qr) =>
123
- qr
124
- .from(Employee)
125
- .where((e) => [expr.eq(e.managerId, e.self![0].id), expr.lt(e.self![0].depth, 3)])
126
- .select((e) => ({
127
- id: e.id,
128
- name: e.name,
129
- depth: expr.raw("number")`${e.self![0].depth} + 1`.n,
130
- })),
131
- )
132
- .select((s) => ({
133
- id: s.id,
134
- name: s.name,
135
- depth: s.depth,
136
- }))
137
- .getSelectQueryDef();
138
-
139
- it("Verify QueryDef", () => {
140
- expect(def).toEqual({
141
- type: "select",
142
- as: "T1",
143
- from: "T2",
144
- with: {
145
- name: "T2",
146
- base: {
147
- type: "select",
148
- as: "T1",
149
- from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
150
- where: [
151
- {
152
- type: "eq",
153
- source: { type: "column", path: ["T1", "managerId"] },
154
- target: { type: "value", value: 1 },
155
- },
156
- ],
157
- select: {
158
- id: { type: "column", path: ["T1", "id"] },
159
- name: { type: "column", path: ["T1", "name"] },
160
- depth: { type: "value", value: 1 },
161
- },
162
- },
163
- recursive: {
164
- type: "select",
165
- as: "T2",
166
- from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
167
- joins: [
168
- {
169
- type: "select",
170
- as: "T2.self",
171
- from: "T2",
172
- isSingle: false,
173
- },
174
- ],
175
- where: [
176
- {
177
- type: "eq",
178
- source: { type: "column", path: ["T2", "managerId"] },
179
- target: { type: "column", path: ["T2.self", "id"] },
180
- },
181
- {
182
- type: "lt",
183
- source: { type: "column", path: ["T2.self", "depth"] },
184
- target: { type: "value", value: 3 },
185
- },
186
- ],
187
- select: {
188
- id: { type: "column", path: ["T2", "id"] },
189
- name: { type: "column", path: ["T2", "name"] },
190
- depth: {
191
- type: "raw",
192
- sql: "$1 + 1",
193
- params: [{ type: "column", path: ["T2.self", "depth"] }],
194
- },
195
- },
196
- },
197
- },
198
- select: {
199
- id: { type: "column", path: ["T1", "id"] },
200
- name: { type: "column", path: ["T1", "name"] },
201
- depth: { type: "column", path: ["T1", "depth"] },
202
- },
203
- });
204
- });
205
-
206
- it.each(dialects)("[%s] Verify SQL", (dialect) => {
207
- const builder = createQueryBuilder(dialect);
208
- expect(builder.build(def)).toMatchSql(expected.depthLimit[dialect]);
209
- });
210
- });
211
-
212
- describe("upward search: select all managers above a specific employee", () => {
213
- const db = createTestDb();
214
- const def = db
215
- .employee()
216
- .where((e) => [expr.eq(e.id, 100)])
217
- .select((e) => ({
218
- id: e.id,
219
- name: e.name,
220
- managerId: e.managerId,
221
- level: expr.val("number", 0),
222
- }))
223
- .recursive((qr) =>
224
- qr
225
- .from(Employee)
226
- .where((e) => [expr.eq(e.id, e.self![0].managerId)])
227
- .select((e) => ({
228
- id: e.id,
229
- name: e.name,
230
- managerId: e.managerId,
231
- level: expr.raw("number")`${e.self![0].level} - 1`.n,
232
- })),
233
- )
234
- .select((s) => ({
235
- id: s.id,
236
- name: s.name,
237
- level: s.level,
238
- }))
239
- .getSelectQueryDef();
240
-
241
- it("Verify QueryDef", () => {
242
- expect(def).toEqual({
243
- type: "select",
244
- as: "T1",
245
- from: "T2",
246
- with: {
247
- name: "T2",
248
- base: {
249
- type: "select",
250
- as: "T1",
251
- from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
252
- where: [
253
- {
254
- type: "eq",
255
- source: { type: "column", path: ["T1", "id"] },
256
- target: { type: "value", value: 100 },
257
- },
258
- ],
259
- select: {
260
- id: { type: "column", path: ["T1", "id"] },
261
- name: { type: "column", path: ["T1", "name"] },
262
- managerId: { type: "column", path: ["T1", "managerId"] },
263
- level: { type: "value", value: 0 },
264
- },
265
- },
266
- recursive: {
267
- type: "select",
268
- as: "T2",
269
- from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
270
- joins: [
271
- {
272
- type: "select",
273
- as: "T2.self",
274
- from: "T2",
275
- isSingle: false,
276
- },
277
- ],
278
- where: [
279
- {
280
- type: "eq",
281
- source: { type: "column", path: ["T2", "id"] },
282
- target: { type: "column", path: ["T2.self", "managerId"] },
283
- },
284
- ],
285
- select: {
286
- id: { type: "column", path: ["T2", "id"] },
287
- name: { type: "column", path: ["T2", "name"] },
288
- managerId: { type: "column", path: ["T2", "managerId"] },
289
- level: {
290
- type: "raw",
291
- sql: "$1 - 1",
292
- params: [{ type: "column", path: ["T2.self", "level"] }],
293
- },
294
- },
295
- },
296
- },
297
- select: {
298
- id: { type: "column", path: ["T1", "id"] },
299
- name: { type: "column", path: ["T1", "name"] },
300
- level: { type: "column", path: ["T1", "level"] },
301
- },
302
- });
303
- });
304
-
305
- it.each(dialects)("[%s] Verify SQL", (dialect) => {
306
- const builder = createQueryBuilder(dialect);
307
- expect(builder.build(def)).toMatchSql(expected.upwardManagers[dialect]);
308
- });
309
- });
310
-
311
- describe("Apply orderBy to CTE result", () => {
312
- const db = createTestDb();
313
- const def = db
314
- .employee()
315
- .where((e) => [expr.eq(e.managerId, 1)])
316
- .select((e) => ({
317
- id: e.id,
318
- name: e.name,
319
- depth: expr.val("number", 1),
320
- }))
321
- .recursive((qr) =>
322
- qr
323
- .from(Employee)
324
- .where((e) => [expr.eq(e.managerId, e.self![0].id)])
325
- .select((e) => ({
326
- id: e.id,
327
- name: e.name,
328
- depth: expr.raw("number")`${e.self![0].depth} + 1`.n,
329
- })),
330
- )
331
- .orderBy((s) => s.depth, "ASC")
332
- .orderBy((s) => s.name, "ASC")
333
- .select((s) => ({
334
- id: s.id,
335
- name: s.name,
336
- depth: s.depth,
337
- }))
338
- .getSelectQueryDef();
339
-
340
- it("Verify QueryDef", () => {
341
- expect(def).toEqual({
342
- type: "select",
343
- as: "T1",
344
- from: "T2",
345
- with: {
346
- name: "T2",
347
- base: {
348
- type: "select",
349
- as: "T1",
350
- from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
351
- where: [
352
- {
353
- type: "eq",
354
- source: { type: "column", path: ["T1", "managerId"] },
355
- target: { type: "value", value: 1 },
356
- },
357
- ],
358
- select: {
359
- id: { type: "column", path: ["T1", "id"] },
360
- name: { type: "column", path: ["T1", "name"] },
361
- depth: { type: "value", value: 1 },
362
- },
363
- },
364
- recursive: {
365
- type: "select",
366
- as: "T2",
367
- from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
368
- joins: [
369
- {
370
- type: "select",
371
- as: "T2.self",
372
- from: "T2",
373
- isSingle: false,
374
- },
375
- ],
376
- where: [
377
- {
378
- type: "eq",
379
- source: { type: "column", path: ["T2", "managerId"] },
380
- target: { type: "column", path: ["T2.self", "id"] },
381
- },
382
- ],
383
- select: {
384
- id: { type: "column", path: ["T2", "id"] },
385
- name: { type: "column", path: ["T2", "name"] },
386
- depth: {
387
- type: "raw",
388
- sql: "$1 + 1",
389
- params: [{ type: "column", path: ["T2.self", "depth"] }],
390
- },
391
- },
392
- },
393
- },
394
- orderBy: [
395
- [{ type: "column", path: ["T1", "depth"] }, "ASC"],
396
- [{ type: "column", path: ["T1", "name"] }, "ASC"],
397
- ],
398
- select: {
399
- id: { type: "column", path: ["T1", "id"] },
400
- name: { type: "column", path: ["T1", "name"] },
401
- depth: { type: "column", path: ["T1", "depth"] },
402
- },
403
- });
404
- });
405
-
406
- it.each(dialects)("[%s] Verify SQL", (dialect) => {
407
- const builder = createQueryBuilder(dialect);
408
- expect(builder.build(def)).toMatchSql(expected.cteWithOrderBy[dialect]);
409
- });
410
- });
411
-
412
- describe("Apply where to CTE result", () => {
413
- const db = createTestDb();
414
- const def = db
415
- .employee()
416
- .where((e) => [expr.eq(e.managerId, 1)])
417
- .select((e) => ({
418
- id: e.id,
419
- name: e.name,
420
- depth: expr.val("number", 1),
421
- }))
422
- .recursive((qr) =>
423
- qr
424
- .from(Employee)
425
- .where((e) => [expr.eq(e.managerId, e.self![0].id)])
426
- .select((e) => ({
427
- id: e.id,
428
- name: e.name,
429
- depth: expr.raw("number")`${e.self![0].depth} + 1`.n,
430
- })),
431
- )
432
- .where((s) => [expr.gt(s.depth, 1)])
433
- .select((s) => ({
434
- id: s.id,
435
- name: s.name,
436
- depth: s.depth,
437
- }))
438
- .getSelectQueryDef();
439
-
440
- it("Verify QueryDef", () => {
441
- expect(def).toEqual({
442
- type: "select",
443
- as: "T1",
444
- from: "T2",
445
- with: {
446
- name: "T2",
447
- base: {
448
- type: "select",
449
- as: "T1",
450
- from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
451
- where: [
452
- {
453
- type: "eq",
454
- source: { type: "column", path: ["T1", "managerId"] },
455
- target: { type: "value", value: 1 },
456
- },
457
- ],
458
- select: {
459
- id: { type: "column", path: ["T1", "id"] },
460
- name: { type: "column", path: ["T1", "name"] },
461
- depth: { type: "value", value: 1 },
462
- },
463
- },
464
- recursive: {
465
- type: "select",
466
- as: "T2",
467
- from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
468
- joins: [
469
- {
470
- type: "select",
471
- as: "T2.self",
472
- from: "T2",
473
- isSingle: false,
474
- },
475
- ],
476
- where: [
477
- {
478
- type: "eq",
479
- source: { type: "column", path: ["T2", "managerId"] },
480
- target: { type: "column", path: ["T2.self", "id"] },
481
- },
482
- ],
483
- select: {
484
- id: { type: "column", path: ["T2", "id"] },
485
- name: { type: "column", path: ["T2", "name"] },
486
- depth: {
487
- type: "raw",
488
- sql: "$1 + 1",
489
- params: [{ type: "column", path: ["T2.self", "depth"] }],
490
- },
491
- },
492
- },
493
- },
494
- where: [
495
- {
496
- type: "gt",
497
- source: { type: "column", path: ["T1", "depth"] },
498
- target: { type: "value", value: 1 },
499
- },
500
- ],
501
- select: {
502
- id: { type: "column", path: ["T1", "id"] },
503
- name: { type: "column", path: ["T1", "name"] },
504
- depth: { type: "column", path: ["T1", "depth"] },
505
- },
506
- });
507
- });
508
-
509
- it.each(dialects)("[%s] Verify SQL", (dialect) => {
510
- const builder = createQueryBuilder(dialect);
511
- expect(builder.build(def)).toMatchSql(expected.cteWithWhere[dialect]);
512
- });
513
- });
514
- });