@simplysm/orm-common 13.0.75 → 13.0.77
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.
- package/README.md +575 -50
- package/dist/create-db-context.d.ts +1 -1
- package/dist/create-db-context.d.ts.map +1 -1
- package/dist/create-db-context.js +34 -27
- package/dist/create-db-context.js.map +1 -1
- package/dist/ddl/initialize.js +4 -4
- package/dist/ddl/initialize.js.map +1 -1
- package/dist/ddl/relation-ddl.d.ts +7 -7
- package/dist/ddl/relation-ddl.d.ts.map +1 -1
- package/dist/ddl/relation-ddl.js +18 -18
- package/dist/ddl/relation-ddl.js.map +1 -1
- package/dist/ddl/schema-ddl.d.ts +1 -1
- package/dist/ddl/schema-ddl.d.ts.map +1 -1
- package/dist/ddl/schema-ddl.js +2 -2
- package/dist/ddl/schema-ddl.js.map +1 -1
- package/dist/ddl/table-ddl.js +2 -2
- package/dist/ddl/table-ddl.js.map +1 -1
- package/dist/exec/queryable.d.ts +24 -24
- package/dist/exec/queryable.d.ts.map +1 -1
- package/dist/exec/queryable.js +37 -37
- package/dist/exec/queryable.js.map +1 -1
- package/dist/expr/expr-unit.js +1 -1
- package/dist/expr/expr-unit.js.map +1 -1
- package/dist/expr/expr.d.ts +9 -9
- package/dist/expr/expr.d.ts.map +1 -1
- package/dist/expr/expr.js +10 -10
- package/dist/expr/expr.js.map +1 -1
- package/dist/query-builder/base/expr-renderer-base.d.ts +2 -2
- package/dist/query-builder/base/expr-renderer-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.d.ts +7 -15
- package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.js +2 -2
- package/dist/query-builder/base/query-builder-base.js.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js +8 -8
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.d.ts +7 -7
- package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.js +7 -7
- package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js +9 -9
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.d.ts +7 -7
- package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.js +11 -11
- package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js +8 -8
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +7 -7
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js +7 -7
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
- package/dist/schema/procedure-builder.d.ts +1 -1
- package/dist/schema/table-builder.d.ts +1 -1
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +1 -1
- package/dist/schema/view-builder.d.ts +1 -1
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +1 -1
- package/dist/types/db-context-def.d.ts +18 -18
- package/dist/types/db-context-def.d.ts.map +1 -1
- package/dist/types/expr.d.ts +6 -6
- package/dist/types/expr.d.ts.map +1 -1
- package/dist/types/query-def.d.ts +15 -15
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/types/query-def.js +6 -6
- package/dist/utils/result-parser.d.ts.map +1 -1
- package/dist/utils/result-parser.js +44 -16
- package/dist/utils/result-parser.js.map +1 -1
- package/package.json +2 -2
- package/src/create-db-context.ts +36 -29
- package/src/ddl/initialize.ts +4 -4
- package/src/ddl/relation-ddl.ts +16 -16
- package/src/ddl/schema-ddl.ts +2 -2
- package/src/ddl/table-ddl.ts +2 -2
- package/src/exec/queryable.ts +58 -58
- package/src/expr/expr-unit.ts +1 -1
- package/src/expr/expr.ts +13 -13
- package/src/query-builder/base/expr-renderer-base.ts +2 -2
- package/src/query-builder/base/query-builder-base.ts +18 -14
- package/src/query-builder/mssql/mssql-expr-renderer.ts +11 -10
- package/src/query-builder/mssql/mssql-query-builder.ts +13 -13
- package/src/query-builder/mysql/mysql-expr-renderer.ts +12 -11
- package/src/query-builder/mysql/mysql-query-builder.ts +17 -17
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +11 -10
- package/src/query-builder/postgresql/postgresql-query-builder.ts +13 -13
- package/src/schema/procedure-builder.ts +1 -1
- package/src/schema/table-builder.ts +1 -1
- package/src/schema/view-builder.ts +1 -1
- package/src/types/db-context-def.ts +18 -18
- package/src/types/expr.ts +6 -6
- package/src/types/query-def.ts +31 -31
- package/src/utils/result-parser.ts +60 -16
- package/tests/db-context/create-db-context.spec.ts +6 -37
- package/tests/db-context/define-db-context.spec.ts +0 -51
- package/tests/ddl/basic.expected.ts +8 -8
- package/tests/ddl/basic.spec.ts +24 -181
- package/tests/ddl/column-builder.spec.ts +0 -112
- package/tests/ddl/index-builder.spec.ts +10 -64
- package/tests/ddl/procedure-builder.spec.ts +0 -106
- package/tests/ddl/relation-builder.spec.ts +4 -205
- package/tests/ddl/table-builder.spec.ts +0 -34
- package/tests/ddl/view-builder.spec.ts +0 -60
- package/tests/dml/delete.spec.ts +0 -33
- package/tests/dml/insert.spec.ts +0 -78
- package/tests/dml/update.spec.ts +2 -98
- package/tests/dml/upsert.spec.ts +0 -52
- package/tests/errors/queryable-errors.spec.ts +0 -51
- package/tests/escape.spec.ts +0 -41
- package/tests/examples/pivot.spec.ts +0 -333
- package/tests/examples/sampling.spec.ts +0 -63
- package/tests/examples/unpivot.spec.ts +0 -65
- package/tests/exec/search-parser.spec.ts +0 -16
- package/tests/expr/comparison.spec.ts +0 -66
- package/tests/expr/conditional.expected.ts +2 -2
- package/tests/expr/conditional.spec.ts +8 -35
- package/tests/expr/date.spec.ts +5 -72
- package/tests/expr/math.spec.ts +0 -47
- package/tests/expr/string.spec.ts +0 -56
- package/tests/expr/utility.spec.ts +0 -27
- package/tests/select/basic.spec.ts +5 -74
- package/tests/select/filter.spec.ts +0 -114
- package/tests/select/group.spec.ts +0 -85
- package/tests/select/join.spec.ts +0 -113
- package/tests/select/order.spec.ts +0 -49
- package/tests/select/subquery.spec.ts +0 -96
- package/tests/select/window.spec.ts +0 -185
- package/tests/types/nullable-queryable-record.spec.ts +0 -48
- package/tests/utils/result-parser-perf.spec.ts +0 -67
- package/tests/utils/result-parser.spec.ts +4 -38
|
@@ -23,54 +23,6 @@ describe("DDL - Procedure Builder", () => {
|
|
|
23
23
|
});
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
-
describe("description specified", () => {
|
|
27
|
-
const proc = Procedure("TestProc").description("Test procedure");
|
|
28
|
-
|
|
29
|
-
it("should validate metadata", () => {
|
|
30
|
-
expect(proc.meta).toEqual({
|
|
31
|
-
name: "TestProc",
|
|
32
|
-
description: "Test procedure",
|
|
33
|
-
database: undefined,
|
|
34
|
-
schema: undefined,
|
|
35
|
-
params: undefined,
|
|
36
|
-
returns: undefined,
|
|
37
|
-
query: undefined,
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
describe("database specified", () => {
|
|
43
|
-
const proc = Procedure("TestProc").database("CustomDb");
|
|
44
|
-
|
|
45
|
-
it("should validate metadata", () => {
|
|
46
|
-
expect(proc.meta).toEqual({
|
|
47
|
-
name: "TestProc",
|
|
48
|
-
description: undefined,
|
|
49
|
-
database: "CustomDb",
|
|
50
|
-
schema: undefined,
|
|
51
|
-
params: undefined,
|
|
52
|
-
returns: undefined,
|
|
53
|
-
query: undefined,
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe("schema specified", () => {
|
|
59
|
-
const proc = Procedure("TestProc").schema("CustomSchema");
|
|
60
|
-
|
|
61
|
-
it("should validate metadata", () => {
|
|
62
|
-
expect(proc.meta).toEqual({
|
|
63
|
-
name: "TestProc",
|
|
64
|
-
description: undefined,
|
|
65
|
-
database: undefined,
|
|
66
|
-
schema: "CustomSchema",
|
|
67
|
-
params: undefined,
|
|
68
|
-
returns: undefined,
|
|
69
|
-
query: undefined,
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
26
|
describe("params specified (single parameter)", () => {
|
|
75
27
|
const proc = Procedure("TestProc").params((c) => ({ id: c.bigint() }));
|
|
76
28
|
|
|
@@ -82,23 +34,6 @@ describe("DDL - Procedure Builder", () => {
|
|
|
82
34
|
});
|
|
83
35
|
});
|
|
84
36
|
|
|
85
|
-
describe("params specified (multiple parameters)", () => {
|
|
86
|
-
const proc = Procedure("TestProc").params((c) => ({
|
|
87
|
-
id: c.bigint(),
|
|
88
|
-
name: c.varchar(100),
|
|
89
|
-
isActive: c.boolean(),
|
|
90
|
-
}));
|
|
91
|
-
|
|
92
|
-
it("should validate metadata", () => {
|
|
93
|
-
expect(proc.meta.name).toBe("TestProc");
|
|
94
|
-
expect(proc.meta.params).toBeDefined();
|
|
95
|
-
expect(Object.keys(proc.meta.params!)).toEqual(["id", "name", "isActive"]);
|
|
96
|
-
expect(proc.meta.params!.id.meta.dataType).toEqual({ type: "bigint" });
|
|
97
|
-
expect(proc.meta.params!.name.meta.dataType).toEqual({ type: "varchar", length: 100 });
|
|
98
|
-
expect(proc.meta.params!.isActive.meta.dataType).toEqual({ type: "boolean" });
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
|
|
102
37
|
describe("returns specified (single return)", () => {
|
|
103
38
|
const proc = Procedure("TestProc").returns((c) => ({ id: c.bigint() }));
|
|
104
39
|
|
|
@@ -110,24 +45,6 @@ describe("DDL - Procedure Builder", () => {
|
|
|
110
45
|
});
|
|
111
46
|
});
|
|
112
47
|
|
|
113
|
-
describe("returns specified (multiple returns)", () => {
|
|
114
|
-
const proc = Procedure("TestProc").returns((c) => ({
|
|
115
|
-
id: c.bigint(),
|
|
116
|
-
name: c.varchar(100),
|
|
117
|
-
email: c.varchar(200).nullable(),
|
|
118
|
-
}));
|
|
119
|
-
|
|
120
|
-
it("should validate metadata", () => {
|
|
121
|
-
expect(proc.meta.name).toBe("TestProc");
|
|
122
|
-
expect(proc.meta.returns).toBeDefined();
|
|
123
|
-
expect(Object.keys(proc.meta.returns!)).toEqual(["id", "name", "email"]);
|
|
124
|
-
expect(proc.meta.returns!.id.meta.dataType).toEqual({ type: "bigint" });
|
|
125
|
-
expect(proc.meta.returns!.name.meta.dataType).toEqual({ type: "varchar", length: 100 });
|
|
126
|
-
expect(proc.meta.returns!.email.meta.dataType).toEqual({ type: "varchar", length: 200 });
|
|
127
|
-
expect(proc.meta.returns!.email.meta.nullable).toBe(true);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
|
|
131
48
|
describe("body specified + basic DDL generation", () => {
|
|
132
49
|
const proc = Procedure("TestProc")
|
|
133
50
|
.database("TestDb")
|
|
@@ -208,27 +125,4 @@ describe("DDL - Procedure Builder", () => {
|
|
|
208
125
|
});
|
|
209
126
|
});
|
|
210
127
|
|
|
211
|
-
describe("method chaining order", () => {
|
|
212
|
-
// Same result even with different method chaining order
|
|
213
|
-
const proc1 = Procedure("TestProc")
|
|
214
|
-
.params((c) => ({ id: c.bigint() }))
|
|
215
|
-
.database("TestDb")
|
|
216
|
-
.schema("TestSchema")
|
|
217
|
-
.body("SELECT 1");
|
|
218
|
-
|
|
219
|
-
const proc2 = Procedure("TestProc")
|
|
220
|
-
.database("TestDb")
|
|
221
|
-
.schema("TestSchema")
|
|
222
|
-
.params((c) => ({ id: c.bigint() }))
|
|
223
|
-
.body("SELECT 1");
|
|
224
|
-
|
|
225
|
-
it("should validate metadata consistency", () => {
|
|
226
|
-
// params is an object so deep comparison is needed
|
|
227
|
-
expect(proc1.meta.name).toBe(proc2.meta.name);
|
|
228
|
-
expect(proc1.meta.database).toBe(proc2.meta.database);
|
|
229
|
-
expect(proc1.meta.schema).toBe(proc2.meta.schema);
|
|
230
|
-
expect(proc1.meta.query).toBe(proc2.meta.query);
|
|
231
|
-
expect(Object.keys(proc1.meta.params!)).toEqual(Object.keys(proc2.meta.params!));
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
128
|
});
|
|
@@ -36,7 +36,7 @@ describe("DDL - Relation Builder", () => {
|
|
|
36
36
|
const fkBuilder = RelationFactory.foreignKey(["userId"], () => User);
|
|
37
37
|
|
|
38
38
|
const db = createTestDb();
|
|
39
|
-
const def = db.
|
|
39
|
+
const def = db.getAddForeignKeyQueryDef(
|
|
40
40
|
{ database: "TestDb", schema: "TestSchema", name: "Post" },
|
|
41
41
|
"user",
|
|
42
42
|
fkBuilder,
|
|
@@ -44,47 +44,7 @@ describe("DDL - Relation Builder", () => {
|
|
|
44
44
|
|
|
45
45
|
it("should validate QueryDef", () => {
|
|
46
46
|
expect(def).toEqual({
|
|
47
|
-
type: "
|
|
48
|
-
table: { database: "TestDb", schema: "TestSchema", name: "Post" },
|
|
49
|
-
foreignKey: {
|
|
50
|
-
name: "FK_Post_user",
|
|
51
|
-
fkColumns: ["userId"],
|
|
52
|
-
targetTable: { database: "TestDb", schema: "TestSchema", name: "User" },
|
|
53
|
-
targetPkColumns: ["id"],
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it.each(dialects)("[%s] should validate SQL", (dialect) => {
|
|
59
|
-
const builder = createQueryBuilder(dialect);
|
|
60
|
-
expect(builder.build(def)).toMatchSql(expected.basicForeignKey[dialect]);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
describe("ForeignKeyBuilder - description specified", () => {
|
|
65
|
-
const Post = Table("Post")
|
|
66
|
-
.database("TestDb")
|
|
67
|
-
.schema("TestSchema")
|
|
68
|
-
.columns((c) => ({
|
|
69
|
-
id: c.bigint(),
|
|
70
|
-
userId: c.bigint(),
|
|
71
|
-
}))
|
|
72
|
-
.primaryKey("id")
|
|
73
|
-
.relations(() => ({}));
|
|
74
|
-
|
|
75
|
-
const RelationFactory = createRelationFactory(() => Post);
|
|
76
|
-
const fkBuilder = RelationFactory.foreignKey(["userId"], () => User).description("User relationship");
|
|
77
|
-
|
|
78
|
-
const db = createTestDb();
|
|
79
|
-
const def = db.getAddFkQueryDef(
|
|
80
|
-
{ database: "TestDb", schema: "TestSchema", name: "Post" },
|
|
81
|
-
"user",
|
|
82
|
-
fkBuilder,
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
it("should validate QueryDef", () => {
|
|
86
|
-
expect(def).toEqual({
|
|
87
|
-
type: "addFk",
|
|
47
|
+
type: "addForeignKey",
|
|
88
48
|
table: { database: "TestDb", schema: "TestSchema", name: "Post" },
|
|
89
49
|
foreignKey: {
|
|
90
50
|
name: "FK_Post_user",
|
|
@@ -128,7 +88,7 @@ describe("DDL - Relation Builder", () => {
|
|
|
128
88
|
const fkBuilder = RelationFactory.foreignKey(["companyId", "companyRegionId"], () => Company);
|
|
129
89
|
|
|
130
90
|
const db = createTestDb();
|
|
131
|
-
const def = db.
|
|
91
|
+
const def = db.getAddForeignKeyQueryDef(
|
|
132
92
|
{ database: "TestDb", schema: "TestSchema", name: "Employee" },
|
|
133
93
|
"company",
|
|
134
94
|
fkBuilder,
|
|
@@ -136,7 +96,7 @@ describe("DDL - Relation Builder", () => {
|
|
|
136
96
|
|
|
137
97
|
it("should validate QueryDef", () => {
|
|
138
98
|
expect(def).toEqual({
|
|
139
|
-
type: "
|
|
99
|
+
type: "addForeignKey",
|
|
140
100
|
table: { database: "TestDb", schema: "TestSchema", name: "Employee" },
|
|
141
101
|
foreignKey: {
|
|
142
102
|
name: "FK_Employee_company",
|
|
@@ -207,166 +167,5 @@ describe("DDL - Relation Builder", () => {
|
|
|
207
167
|
});
|
|
208
168
|
});
|
|
209
169
|
|
|
210
|
-
describe("ForeignKeyTargetBuilder - description specified", () => {
|
|
211
|
-
const Post = Table("Post")
|
|
212
|
-
.database("TestDb")
|
|
213
|
-
.schema("TestSchema")
|
|
214
|
-
.columns((c) => ({
|
|
215
|
-
id: c.bigint(),
|
|
216
|
-
userId: c.bigint(),
|
|
217
|
-
}))
|
|
218
|
-
.primaryKey("id")
|
|
219
|
-
.relations(() => ({}));
|
|
220
|
-
|
|
221
|
-
const RelationFactory = createRelationFactory(() => User);
|
|
222
|
-
const targetBuilder = RelationFactory.foreignKeyTarget(() => Post, "posts").description(
|
|
223
|
-
"List of posts by user",
|
|
224
|
-
);
|
|
225
|
-
|
|
226
|
-
it("should validate metadata", () => {
|
|
227
|
-
expect(targetBuilder.meta).toEqual({
|
|
228
|
-
targetTableFn: expect.any(Function),
|
|
229
|
-
relationName: "posts",
|
|
230
|
-
description: "List of posts by user",
|
|
231
|
-
isSingle: undefined,
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
//#endregion
|
|
237
|
-
|
|
238
|
-
//#region ========== RelationKeyBuilder ==========
|
|
239
|
-
|
|
240
|
-
describe("RelationKeyBuilder - basic", () => {
|
|
241
|
-
const Post = Table("Post")
|
|
242
|
-
.database("TestDb")
|
|
243
|
-
.schema("TestSchema")
|
|
244
|
-
.columns((c) => ({
|
|
245
|
-
id: c.bigint(),
|
|
246
|
-
authorId: c.bigint(),
|
|
247
|
-
}))
|
|
248
|
-
.primaryKey("id")
|
|
249
|
-
.relations(() => ({}));
|
|
250
|
-
|
|
251
|
-
const RelationFactory = createRelationFactory(() => Post);
|
|
252
|
-
const rkBuilder = RelationFactory.relationKey(["authorId"], () => User);
|
|
253
|
-
|
|
254
|
-
// RelationKey does not register FK in DB so getAddFkQueryDef test is not possible
|
|
255
|
-
// Only metadata validation
|
|
256
|
-
it("should validate metadata", () => {
|
|
257
|
-
expect(rkBuilder.meta).toEqual({
|
|
258
|
-
ownerFn: expect.any(Function),
|
|
259
|
-
columns: ["authorId"],
|
|
260
|
-
targetFn: expect.any(Function),
|
|
261
|
-
description: undefined,
|
|
262
|
-
});
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
describe("RelationKeyBuilder - description specified", () => {
|
|
267
|
-
const Post = Table("Post")
|
|
268
|
-
.database("TestDb")
|
|
269
|
-
.schema("TestSchema")
|
|
270
|
-
.columns((c) => ({
|
|
271
|
-
id: c.bigint(),
|
|
272
|
-
authorId: c.bigint(),
|
|
273
|
-
}))
|
|
274
|
-
.primaryKey("id")
|
|
275
|
-
.relations(() => ({}));
|
|
276
|
-
|
|
277
|
-
const RelationFactory = createRelationFactory(() => Post);
|
|
278
|
-
const rkBuilder = RelationFactory.relationKey(["authorId"], () => User).description(
|
|
279
|
-
"Author relationship (logical)",
|
|
280
|
-
);
|
|
281
|
-
|
|
282
|
-
it("should validate metadata", () => {
|
|
283
|
-
expect(rkBuilder.meta).toEqual({
|
|
284
|
-
ownerFn: expect.any(Function),
|
|
285
|
-
columns: ["authorId"],
|
|
286
|
-
targetFn: expect.any(Function),
|
|
287
|
-
description: "Author relationship (logical)",
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
//#endregion
|
|
293
|
-
|
|
294
|
-
//#region ========== RelationKeyTargetBuilder ==========
|
|
295
|
-
|
|
296
|
-
describe("RelationKeyTargetBuilder - basic (array)", () => {
|
|
297
|
-
const Post = Table("Post")
|
|
298
|
-
.database("TestDb")
|
|
299
|
-
.schema("TestSchema")
|
|
300
|
-
.columns((c) => ({
|
|
301
|
-
id: c.bigint(),
|
|
302
|
-
authorId: c.bigint(),
|
|
303
|
-
}))
|
|
304
|
-
.primaryKey("id")
|
|
305
|
-
.relations(() => ({}));
|
|
306
|
-
|
|
307
|
-
const RelationFactory = createRelationFactory(() => User);
|
|
308
|
-
const targetBuilder = RelationFactory.relationKeyTarget(() => Post, "authoredPosts");
|
|
309
|
-
|
|
310
|
-
it("should validate metadata", () => {
|
|
311
|
-
expect(targetBuilder.meta).toEqual({
|
|
312
|
-
targetTableFn: expect.any(Function),
|
|
313
|
-
relationName: "authoredPosts",
|
|
314
|
-
description: undefined,
|
|
315
|
-
isSingle: undefined,
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
describe("RelationKeyTargetBuilder - single() method", () => {
|
|
321
|
-
const Post = Table("Post")
|
|
322
|
-
.database("TestDb")
|
|
323
|
-
.schema("TestSchema")
|
|
324
|
-
.columns((c) => ({
|
|
325
|
-
id: c.bigint(),
|
|
326
|
-
authorId: c.bigint(),
|
|
327
|
-
}))
|
|
328
|
-
.primaryKey("id")
|
|
329
|
-
.relations(() => ({}));
|
|
330
|
-
|
|
331
|
-
const RelationFactory = createRelationFactory(() => User);
|
|
332
|
-
const targetBuilder = RelationFactory.relationKeyTarget(() => Post, "featuredPost").single();
|
|
333
|
-
|
|
334
|
-
it("should validate metadata", () => {
|
|
335
|
-
expect(targetBuilder.meta).toEqual({
|
|
336
|
-
targetTableFn: expect.any(Function),
|
|
337
|
-
relationName: "featuredPost",
|
|
338
|
-
description: undefined,
|
|
339
|
-
isSingle: true,
|
|
340
|
-
});
|
|
341
|
-
});
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
describe("RelationKeyTargetBuilder - description specified", () => {
|
|
345
|
-
const Post = Table("Post")
|
|
346
|
-
.database("TestDb")
|
|
347
|
-
.schema("TestSchema")
|
|
348
|
-
.columns((c) => ({
|
|
349
|
-
id: c.bigint(),
|
|
350
|
-
authorId: c.bigint(),
|
|
351
|
-
}))
|
|
352
|
-
.primaryKey("id")
|
|
353
|
-
.relations(() => ({}));
|
|
354
|
-
|
|
355
|
-
const RelationFactory = createRelationFactory(() => User);
|
|
356
|
-
const targetBuilder = RelationFactory.relationKeyTarget(
|
|
357
|
-
() => Post,
|
|
358
|
-
"authoredPosts",
|
|
359
|
-
).description("List of authored posts (logical)");
|
|
360
|
-
|
|
361
|
-
it("should validate metadata", () => {
|
|
362
|
-
expect(targetBuilder.meta).toEqual({
|
|
363
|
-
targetTableFn: expect.any(Function),
|
|
364
|
-
relationName: "authoredPosts",
|
|
365
|
-
description: "List of authored posts (logical)",
|
|
366
|
-
isSingle: undefined,
|
|
367
|
-
});
|
|
368
|
-
});
|
|
369
|
-
});
|
|
370
|
-
|
|
371
170
|
//#endregion
|
|
372
171
|
});
|
|
@@ -24,23 +24,6 @@ describe("DDL - Table Builder", () => {
|
|
|
24
24
|
});
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
-
describe("description specified", () => {
|
|
28
|
-
const table = Table("User").description("User table");
|
|
29
|
-
|
|
30
|
-
it("should validate metadata", () => {
|
|
31
|
-
expect(table.meta).toEqual({
|
|
32
|
-
name: "User",
|
|
33
|
-
description: "User table",
|
|
34
|
-
database: undefined,
|
|
35
|
-
schema: undefined,
|
|
36
|
-
columns: undefined,
|
|
37
|
-
primaryKey: undefined,
|
|
38
|
-
relations: undefined,
|
|
39
|
-
indexes: undefined,
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
|
|
44
27
|
describe("database specified", () => {
|
|
45
28
|
const table = Table("User").database("CustomDb");
|
|
46
29
|
|
|
@@ -58,23 +41,6 @@ describe("DDL - Table Builder", () => {
|
|
|
58
41
|
});
|
|
59
42
|
});
|
|
60
43
|
|
|
61
|
-
describe("schema specified", () => {
|
|
62
|
-
const table = Table("User").schema("CustomSchema");
|
|
63
|
-
|
|
64
|
-
it("should validate metadata", () => {
|
|
65
|
-
expect(table.meta).toEqual({
|
|
66
|
-
name: "User",
|
|
67
|
-
description: undefined,
|
|
68
|
-
database: undefined,
|
|
69
|
-
schema: "CustomSchema",
|
|
70
|
-
columns: undefined,
|
|
71
|
-
primaryKey: undefined,
|
|
72
|
-
relations: undefined,
|
|
73
|
-
indexes: undefined,
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
|
|
78
44
|
describe("columns specified (single column)", () => {
|
|
79
45
|
const table = Table("User").columns((c) => ({ id: c.bigint() }));
|
|
80
46
|
|
|
@@ -7,66 +7,6 @@ import "../setup/test-utils"; // toMatchSql matcher
|
|
|
7
7
|
import * as expected from "./view-builder.expected";
|
|
8
8
|
|
|
9
9
|
describe("DDL - View Builder", () => {
|
|
10
|
-
describe("basic view (name only)", () => {
|
|
11
|
-
const view = View("TestView");
|
|
12
|
-
|
|
13
|
-
it("should validate metadata", () => {
|
|
14
|
-
expect(view.meta).toEqual({
|
|
15
|
-
name: "TestView",
|
|
16
|
-
description: undefined,
|
|
17
|
-
database: undefined,
|
|
18
|
-
schema: undefined,
|
|
19
|
-
viewFn: undefined,
|
|
20
|
-
relations: undefined,
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
describe("description specified", () => {
|
|
26
|
-
const view = View("TestView").description("This is a test view");
|
|
27
|
-
|
|
28
|
-
it("should validate metadata", () => {
|
|
29
|
-
expect(view.meta).toEqual({
|
|
30
|
-
name: "TestView",
|
|
31
|
-
description: "This is a test view",
|
|
32
|
-
database: undefined,
|
|
33
|
-
schema: undefined,
|
|
34
|
-
viewFn: undefined,
|
|
35
|
-
relations: undefined,
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
describe("database specified", () => {
|
|
41
|
-
const view = View("TestView").database("CustomDb");
|
|
42
|
-
|
|
43
|
-
it("should validate metadata", () => {
|
|
44
|
-
expect(view.meta).toEqual({
|
|
45
|
-
name: "TestView",
|
|
46
|
-
description: undefined,
|
|
47
|
-
database: "CustomDb",
|
|
48
|
-
schema: undefined,
|
|
49
|
-
viewFn: undefined,
|
|
50
|
-
relations: undefined,
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe("schema specified", () => {
|
|
56
|
-
const view = View("TestView").schema("CustomSchema");
|
|
57
|
-
|
|
58
|
-
it("should validate metadata", () => {
|
|
59
|
-
expect(view.meta).toEqual({
|
|
60
|
-
name: "TestView",
|
|
61
|
-
description: undefined,
|
|
62
|
-
database: undefined,
|
|
63
|
-
schema: "CustomSchema",
|
|
64
|
-
viewFn: undefined,
|
|
65
|
-
relations: undefined,
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
|
|
70
10
|
describe("query specified (basic SELECT)", () => {
|
|
71
11
|
const view = View("TestView").query((db: TestDbContext) =>
|
|
72
12
|
db.user().select((u) => ({
|
package/tests/dml/delete.spec.ts
CHANGED
|
@@ -60,39 +60,6 @@ describe("DELETE - Basic", () => {
|
|
|
60
60
|
});
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
-
describe("DELETE with multiple conditions", () => {
|
|
64
|
-
const db = createTestDb();
|
|
65
|
-
|
|
66
|
-
const def = db
|
|
67
|
-
.employee()
|
|
68
|
-
.where((e) => [expr.eq(e.departmentId, 1), expr.null(e.managerId)])
|
|
69
|
-
.getDeleteQueryDef();
|
|
70
|
-
|
|
71
|
-
it("should validate QueryDef", () => {
|
|
72
|
-
expect(def).toEqual({
|
|
73
|
-
type: "delete",
|
|
74
|
-
table: { database: "TestDb", schema: "TestSchema", name: "Employee" },
|
|
75
|
-
as: "T1",
|
|
76
|
-
where: [
|
|
77
|
-
{
|
|
78
|
-
type: "eq",
|
|
79
|
-
source: { type: "column", path: ["T1", "departmentId"] },
|
|
80
|
-
target: { type: "value", value: 1 },
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
type: "null",
|
|
84
|
-
arg: { type: "column", path: ["T1", "managerId"] },
|
|
85
|
-
},
|
|
86
|
-
],
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it.each(dialects)("[%s] should validate SQL", (dialect) => {
|
|
91
|
-
const builder = createQueryBuilder(dialect);
|
|
92
|
-
expect(builder.build(def)).toMatchSql(expected.deleteMultiCond[dialect]);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
|
|
96
63
|
describe("output column specified", () => {
|
|
97
64
|
const db = createTestDb();
|
|
98
65
|
|
package/tests/dml/insert.spec.ts
CHANGED
|
@@ -161,44 +161,6 @@ describe("INSERT IF NOT EXISTS", () => {
|
|
|
161
161
|
});
|
|
162
162
|
});
|
|
163
163
|
|
|
164
|
-
describe("Check duplicates with complex conditions", () => {
|
|
165
|
-
const db = createTestDb();
|
|
166
|
-
const def = db
|
|
167
|
-
.employee()
|
|
168
|
-
.where((e) => [expr.eq(e.name, "Gildong Hong"), expr.eq(e.departmentId, 1)])
|
|
169
|
-
.getInsertIfNotExistsQueryDef({ name: "Gildong Hong", departmentId: 1 });
|
|
170
|
-
|
|
171
|
-
it("Verify QueryDef", () => {
|
|
172
|
-
expect(def).toEqual({
|
|
173
|
-
type: "insertIfNotExists",
|
|
174
|
-
table: { database: "TestDb", schema: "TestSchema", name: "Employee" },
|
|
175
|
-
record: { name: "Gildong Hong", departmentId: 1 },
|
|
176
|
-
existsSelectQuery: {
|
|
177
|
-
type: "select",
|
|
178
|
-
as: "T1",
|
|
179
|
-
from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
|
|
180
|
-
where: [
|
|
181
|
-
{
|
|
182
|
-
type: "eq",
|
|
183
|
-
source: { type: "column", path: ["T1", "name"] },
|
|
184
|
-
target: { type: "value", value: "Gildong Hong" },
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
type: "eq",
|
|
188
|
-
source: { type: "column", path: ["T1", "departmentId"] },
|
|
189
|
-
target: { type: "value", value: 1 },
|
|
190
|
-
},
|
|
191
|
-
],
|
|
192
|
-
},
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
197
|
-
const builder = createQueryBuilder(dialect);
|
|
198
|
-
expect(builder.build(def)).toMatchSql(expected.insertIfNotExistsMultiple[dialect]);
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
|
|
202
164
|
//#endregion
|
|
203
165
|
});
|
|
204
166
|
|
|
@@ -244,45 +206,5 @@ describe("INSERT INTO ... SELECT", () => {
|
|
|
244
206
|
});
|
|
245
207
|
});
|
|
246
208
|
|
|
247
|
-
describe("INSERT INTO SELECT with WHERE condition", () => {
|
|
248
|
-
const db = createTestDb();
|
|
249
|
-
const def = db
|
|
250
|
-
.employee()
|
|
251
|
-
.where((e) => [expr.eq(e.departmentId, 1)])
|
|
252
|
-
.select((e) => ({
|
|
253
|
-
id: e.id,
|
|
254
|
-
name: e.name,
|
|
255
|
-
}))
|
|
256
|
-
.getInsertIntoQueryDef(EmployeeBackup);
|
|
257
|
-
|
|
258
|
-
it("Verify QueryDef", () => {
|
|
259
|
-
expect(def).toEqual({
|
|
260
|
-
type: "insertInto",
|
|
261
|
-
table: { database: "TestDb", schema: "TestSchema", name: "EmployeeBackup" },
|
|
262
|
-
recordsSelectQuery: {
|
|
263
|
-
type: "select",
|
|
264
|
-
as: "T1",
|
|
265
|
-
from: { database: "TestDb", schema: "TestSchema", name: "Employee" },
|
|
266
|
-
where: [
|
|
267
|
-
{
|
|
268
|
-
type: "eq",
|
|
269
|
-
source: { type: "column", path: ["T1", "departmentId"] },
|
|
270
|
-
target: { type: "value", value: 1 },
|
|
271
|
-
},
|
|
272
|
-
],
|
|
273
|
-
select: {
|
|
274
|
-
id: { type: "column", path: ["T1", "id"] },
|
|
275
|
-
name: { type: "column", path: ["T1", "name"] },
|
|
276
|
-
},
|
|
277
|
-
},
|
|
278
|
-
});
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
282
|
-
const builder = createQueryBuilder(dialect);
|
|
283
|
-
expect(builder.build(def)).toMatchSql(expected.insertIntoSelectWhere[dialect]);
|
|
284
|
-
});
|
|
285
|
-
});
|
|
286
|
-
|
|
287
209
|
//#endregion
|
|
288
210
|
});
|