@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
|
@@ -39,67 +39,4 @@ describe("EXAMPLE - Random sampling", () => {
|
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
41
|
|
|
42
|
-
describe("Conditional sampling (WHERE + ORDER BY RANDOM + TOP)", () => {
|
|
43
|
-
const db = createTestDb();
|
|
44
|
-
const def = db
|
|
45
|
-
.user()
|
|
46
|
-
.where((item) => [expr.gte(item.age, 20)])
|
|
47
|
-
.orderBy(() => expr.random())
|
|
48
|
-
.top(3)
|
|
49
|
-
.getSelectQueryDef();
|
|
50
|
-
|
|
51
|
-
it("Verify QueryDef", () => {
|
|
52
|
-
expect(def).toEqual({
|
|
53
|
-
type: "select",
|
|
54
|
-
as: "T1",
|
|
55
|
-
from: { database: "TestDb", schema: "TestSchema", name: "User" },
|
|
56
|
-
where: [
|
|
57
|
-
{
|
|
58
|
-
type: "gte",
|
|
59
|
-
source: { type: "column", path: ["T1", "age"] },
|
|
60
|
-
target: { type: "value", value: 20 },
|
|
61
|
-
},
|
|
62
|
-
],
|
|
63
|
-
orderBy: [[{ type: "random" }]],
|
|
64
|
-
top: 3,
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
69
|
-
const builder = createQueryBuilder(dialect);
|
|
70
|
-
expect(builder.build(def)).toMatchSql(expected.samplingWithWhere[dialect]);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
describe("Column selection with sampling", () => {
|
|
75
|
-
const db = createTestDb();
|
|
76
|
-
const def = db
|
|
77
|
-
.user()
|
|
78
|
-
.select((item) => ({
|
|
79
|
-
id: item.id,
|
|
80
|
-
name: item.name,
|
|
81
|
-
}))
|
|
82
|
-
.orderBy(() => expr.random())
|
|
83
|
-
.top(10)
|
|
84
|
-
.getSelectQueryDef();
|
|
85
|
-
|
|
86
|
-
it("Verify QueryDef", () => {
|
|
87
|
-
expect(def).toEqual({
|
|
88
|
-
type: "select",
|
|
89
|
-
as: "T1",
|
|
90
|
-
from: { database: "TestDb", schema: "TestSchema", name: "User" },
|
|
91
|
-
select: {
|
|
92
|
-
id: { type: "column", path: ["T1", "id"] },
|
|
93
|
-
name: { type: "column", path: ["T1", "name"] },
|
|
94
|
-
},
|
|
95
|
-
orderBy: [[{ type: "random" }]],
|
|
96
|
-
top: 10,
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
101
|
-
const builder = createQueryBuilder(dialect);
|
|
102
|
-
expect(builder.build(def)).toMatchSql(expected.samplingWithSelect[dialect]);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
42
|
});
|
|
@@ -79,71 +79,6 @@ describe("SELECT - UNPIVOT (join + union)", () => {
|
|
|
79
79
|
});
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
-
describe("2-column unpivot", () => {
|
|
83
|
-
const db = createTestDb();
|
|
84
|
-
const def = db
|
|
85
|
-
.monthlySales()
|
|
86
|
-
.join("unpvt", (qr, c) =>
|
|
87
|
-
qr.union(
|
|
88
|
-
qr.select({ period: expr.val("string", "jan"), value: c.jan }),
|
|
89
|
-
qr.select({ period: expr.val("string", "feb"), value: c.feb }),
|
|
90
|
-
),
|
|
91
|
-
)
|
|
92
|
-
.select((item) => ({
|
|
93
|
-
id: item.id,
|
|
94
|
-
category: item.category,
|
|
95
|
-
mar: item.mar,
|
|
96
|
-
period: item.unpvt![0].period,
|
|
97
|
-
value: item.unpvt![0].value,
|
|
98
|
-
}))
|
|
99
|
-
.getSelectQueryDef();
|
|
100
|
-
|
|
101
|
-
it("Verify QueryDef", () => {
|
|
102
|
-
expect(def).toEqual({
|
|
103
|
-
type: "select",
|
|
104
|
-
as: "T1",
|
|
105
|
-
from: { database: "TestDb", schema: "TestSchema", name: "MonthlySales" },
|
|
106
|
-
select: {
|
|
107
|
-
id: { type: "column", path: ["T1", "id"] },
|
|
108
|
-
category: { type: "column", path: ["T1", "category"] },
|
|
109
|
-
mar: { type: "column", path: ["T1", "mar"] },
|
|
110
|
-
period: { type: "column", path: ["T1.unpvt", "period"] },
|
|
111
|
-
value: { type: "column", path: ["T1.unpvt", "value"] },
|
|
112
|
-
},
|
|
113
|
-
joins: [
|
|
114
|
-
{
|
|
115
|
-
type: "select",
|
|
116
|
-
as: "T1.unpvt",
|
|
117
|
-
from: [
|
|
118
|
-
{
|
|
119
|
-
type: "select",
|
|
120
|
-
as: "T1.unpvt",
|
|
121
|
-
select: {
|
|
122
|
-
period: { type: "value", value: "jan" },
|
|
123
|
-
value: { type: "column", path: ["T1", "jan"] },
|
|
124
|
-
},
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
type: "select",
|
|
128
|
-
as: "T1.unpvt",
|
|
129
|
-
select: {
|
|
130
|
-
period: { type: "value", value: "feb" },
|
|
131
|
-
value: { type: "column", path: ["T1", "feb"] },
|
|
132
|
-
},
|
|
133
|
-
},
|
|
134
|
-
],
|
|
135
|
-
isSingle: false,
|
|
136
|
-
},
|
|
137
|
-
],
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
142
|
-
const builder = createQueryBuilder(dialect);
|
|
143
|
-
expect(builder.build(def)).toMatchSql(expected.unpivotTwoColumns[dialect]);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
|
|
147
82
|
describe("WHERE -> UNPIVOT", () => {
|
|
148
83
|
const db = createTestDb();
|
|
149
84
|
const def = db
|
|
@@ -56,14 +56,6 @@ describe("parseSearchQuery", () => {
|
|
|
56
56
|
});
|
|
57
57
|
});
|
|
58
58
|
|
|
59
|
-
it("Multiple identical prefixes", () => {
|
|
60
|
-
expect(parseSearchQuery("+사과 +바나나")).toEqual({
|
|
61
|
-
or: [],
|
|
62
|
-
must: ["%사과%", "%바나나%"],
|
|
63
|
-
not: [],
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
59
|
it("Ignore when only prefixes present", () => {
|
|
68
60
|
expect(parseSearchQuery("+ - ")).toEqual({ or: [], must: [], not: [] });
|
|
69
61
|
expect(parseSearchQuery("+ 사과")).toEqual({ or: ["%사과%"], must: [], not: [] });
|
|
@@ -148,14 +140,6 @@ describe("parseSearchQuery", () => {
|
|
|
148
140
|
});
|
|
149
141
|
});
|
|
150
142
|
|
|
151
|
-
it("* on both sides → contains search (explicit)", () => {
|
|
152
|
-
expect(parseSearchQuery("*사과*")).toEqual({
|
|
153
|
-
or: ["%사과%"],
|
|
154
|
-
must: [],
|
|
155
|
-
not: [],
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
|
|
159
143
|
it("* in middle → middle wildcard", () => {
|
|
160
144
|
expect(parseSearchQuery("사*과")).toEqual({
|
|
161
145
|
or: ["사%과"],
|
|
@@ -69,19 +69,6 @@ describe("Expr - Comparison operators (null-safe)", () => {
|
|
|
69
69
|
.where((item) => [expr.gt(item.age, 20)])
|
|
70
70
|
.getSelectQueryDef();
|
|
71
71
|
|
|
72
|
-
it("Verify QueryDef", () => {
|
|
73
|
-
expect(def).toMatchObject({
|
|
74
|
-
type: "select",
|
|
75
|
-
where: [
|
|
76
|
-
{
|
|
77
|
-
type: "gt",
|
|
78
|
-
source: { type: "column", path: ["T1", "age"] },
|
|
79
|
-
target: { type: "value", value: 20 },
|
|
80
|
-
},
|
|
81
|
-
],
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
|
|
85
72
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
86
73
|
const builder = createQueryBuilder(dialect);
|
|
87
74
|
expect(builder.build(def)).toMatchSql(expected.gt[dialect]);
|
|
@@ -95,19 +82,6 @@ describe("Expr - Comparison operators (null-safe)", () => {
|
|
|
95
82
|
.where((item) => [expr.lt(item.age, 30)])
|
|
96
83
|
.getSelectQueryDef();
|
|
97
84
|
|
|
98
|
-
it("Verify QueryDef", () => {
|
|
99
|
-
expect(def).toMatchObject({
|
|
100
|
-
type: "select",
|
|
101
|
-
where: [
|
|
102
|
-
{
|
|
103
|
-
type: "lt",
|
|
104
|
-
source: { type: "column", path: ["T1", "age"] },
|
|
105
|
-
target: { type: "value", value: 30 },
|
|
106
|
-
},
|
|
107
|
-
],
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
|
|
111
85
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
112
86
|
const builder = createQueryBuilder(dialect);
|
|
113
87
|
expect(builder.build(def)).toMatchSql(expected.lt[dialect]);
|
|
@@ -121,19 +95,6 @@ describe("Expr - Comparison operators (null-safe)", () => {
|
|
|
121
95
|
.where((item) => [expr.gte(item.age, 18)])
|
|
122
96
|
.getSelectQueryDef();
|
|
123
97
|
|
|
124
|
-
it("Verify QueryDef", () => {
|
|
125
|
-
expect(def).toMatchObject({
|
|
126
|
-
type: "select",
|
|
127
|
-
where: [
|
|
128
|
-
{
|
|
129
|
-
type: "gte",
|
|
130
|
-
source: { type: "column", path: ["T1", "age"] },
|
|
131
|
-
target: { type: "value", value: 18 },
|
|
132
|
-
},
|
|
133
|
-
],
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
|
|
137
98
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
138
99
|
const builder = createQueryBuilder(dialect);
|
|
139
100
|
expect(builder.build(def)).toMatchSql(expected.gte[dialect]);
|
|
@@ -147,19 +108,6 @@ describe("Expr - Comparison operators (null-safe)", () => {
|
|
|
147
108
|
.where((item) => [expr.lte(item.age, 65)])
|
|
148
109
|
.getSelectQueryDef();
|
|
149
110
|
|
|
150
|
-
it("Verify QueryDef", () => {
|
|
151
|
-
expect(def).toMatchObject({
|
|
152
|
-
type: "select",
|
|
153
|
-
where: [
|
|
154
|
-
{
|
|
155
|
-
type: "lte",
|
|
156
|
-
source: { type: "column", path: ["T1", "age"] },
|
|
157
|
-
target: { type: "value", value: 65 },
|
|
158
|
-
},
|
|
159
|
-
],
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
|
|
163
111
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
164
112
|
const builder = createQueryBuilder(dialect);
|
|
165
113
|
expect(builder.build(def)).toMatchSql(expected.lte[dialect]);
|
|
@@ -227,20 +175,6 @@ describe("Expr - Comparison operators (null-safe)", () => {
|
|
|
227
175
|
.where((item) => [expr.between(item.age, undefined, 30)])
|
|
228
176
|
.getSelectQueryDef();
|
|
229
177
|
|
|
230
|
-
it("Verify QueryDef", () => {
|
|
231
|
-
expect(def).toMatchObject({
|
|
232
|
-
type: "select",
|
|
233
|
-
where: [
|
|
234
|
-
{
|
|
235
|
-
type: "between",
|
|
236
|
-
source: { type: "column", path: ["T1", "age"] },
|
|
237
|
-
from: undefined,
|
|
238
|
-
to: { type: "value", value: 30 },
|
|
239
|
-
},
|
|
240
|
-
],
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
|
|
244
178
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
245
179
|
const builder = createQueryBuilder(dialect);
|
|
246
180
|
expect(builder.build(def)).toMatchSql(expected.betweenToOnly[dialect]);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mysql, pgsql, tsql } from "@simplysm/core-common";
|
|
2
2
|
import type { ExpectedSql } from "../setup/test-utils";
|
|
3
3
|
|
|
4
|
-
export const
|
|
4
|
+
export const coalesce: ExpectedSql = {
|
|
5
5
|
mysql: mysql`
|
|
6
6
|
SELECT COALESCE(\`T1\`.\`name\`, 'Unknown') AS \`nameOrDefault\`
|
|
7
7
|
FROM \`TestDb\`.\`User\` AS \`T1\`
|
|
@@ -118,7 +118,7 @@ export const least: ExpectedSql = {
|
|
|
118
118
|
`,
|
|
119
119
|
};
|
|
120
120
|
|
|
121
|
-
export const
|
|
121
|
+
export const coalesceMultiple: ExpectedSql = {
|
|
122
122
|
mysql: mysql`
|
|
123
123
|
SELECT COALESCE(\`T1\`.\`email\`, \`T1\`.\`name\`, 'Anonymous') AS \`firstValid\`
|
|
124
124
|
FROM \`TestDb\`.\`User\` AS \`T1\`
|
|
@@ -7,19 +7,19 @@ import "../setup/test-utils"; // toMatchSql matcher
|
|
|
7
7
|
import * as expected from "./conditional.expected";
|
|
8
8
|
|
|
9
9
|
describe("Expr - Conditional functions", () => {
|
|
10
|
-
describe("
|
|
10
|
+
describe("coalesce - null replacement", () => {
|
|
11
11
|
const db = createTestDb();
|
|
12
12
|
const def = db
|
|
13
13
|
.user()
|
|
14
14
|
.select((item) => ({
|
|
15
|
-
nameOrDefault: expr.
|
|
15
|
+
nameOrDefault: expr.coalesce(item.name, "Unknown"),
|
|
16
16
|
}))
|
|
17
17
|
.getSelectQueryDef();
|
|
18
18
|
|
|
19
19
|
it("Verify QueryDef", () => {
|
|
20
20
|
expect(def.select).toMatchObject({
|
|
21
21
|
nameOrDefault: {
|
|
22
|
-
type: "
|
|
22
|
+
type: "coalesce",
|
|
23
23
|
args: [
|
|
24
24
|
{ type: "column", path: ["T1", "name"] },
|
|
25
25
|
{ type: "value", value: "Unknown" },
|
|
@@ -30,7 +30,7 @@ describe("Expr - Conditional functions", () => {
|
|
|
30
30
|
|
|
31
31
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
32
32
|
const builder = createQueryBuilder(dialect);
|
|
33
|
-
expect(builder.build(def)).toMatchSql(expected.
|
|
33
|
+
expect(builder.build(def)).toMatchSql(expected.coalesce[dialect]);
|
|
34
34
|
});
|
|
35
35
|
});
|
|
36
36
|
|
|
@@ -190,33 +190,6 @@ describe("Expr - Conditional functions", () => {
|
|
|
190
190
|
});
|
|
191
191
|
});
|
|
192
192
|
|
|
193
|
-
describe("least - minimum value", () => {
|
|
194
|
-
const db = createTestDb();
|
|
195
|
-
const def = db
|
|
196
|
-
.user()
|
|
197
|
-
.select((item) => ({
|
|
198
|
-
minVal: expr.least(item.age, 100),
|
|
199
|
-
}))
|
|
200
|
-
.getSelectQueryDef();
|
|
201
|
-
|
|
202
|
-
it("Verify QueryDef", () => {
|
|
203
|
-
expect(def.select).toMatchObject({
|
|
204
|
-
minVal: {
|
|
205
|
-
type: "least",
|
|
206
|
-
args: expect.arrayContaining([
|
|
207
|
-
{ type: "column", path: ["T1", "age"] },
|
|
208
|
-
{ type: "value", value: 100 },
|
|
209
|
-
]),
|
|
210
|
-
},
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
215
|
-
const builder = createQueryBuilder(dialect);
|
|
216
|
-
expect(builder.build(def)).toMatchSql(expected.least[dialect]);
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
|
|
220
193
|
describe("switch - all case/default are undefined", () => {
|
|
221
194
|
it("throws an error", () => {
|
|
222
195
|
const db = createTestDb();
|
|
@@ -246,19 +219,19 @@ describe("Expr - Conditional functions", () => {
|
|
|
246
219
|
});
|
|
247
220
|
});
|
|
248
221
|
|
|
249
|
-
describe("
|
|
222
|
+
describe("coalesce - create COALESCE with 3+ arguments", () => {
|
|
250
223
|
const db = createTestDb();
|
|
251
224
|
const def = db
|
|
252
225
|
.user()
|
|
253
226
|
.select((item) => ({
|
|
254
|
-
firstValid: expr.
|
|
227
|
+
firstValid: expr.coalesce(item.email, item.name, "Anonymous"),
|
|
255
228
|
}))
|
|
256
229
|
.getSelectQueryDef();
|
|
257
230
|
|
|
258
231
|
it("Verify QueryDef", () => {
|
|
259
232
|
expect(def.select).toMatchObject({
|
|
260
233
|
firstValid: {
|
|
261
|
-
type: "
|
|
234
|
+
type: "coalesce",
|
|
262
235
|
args: [
|
|
263
236
|
{ type: "column", path: ["T1", "email"] },
|
|
264
237
|
{ type: "column", path: ["T1", "name"] },
|
|
@@ -270,7 +243,7 @@ describe("Expr - Conditional functions", () => {
|
|
|
270
243
|
|
|
271
244
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
272
245
|
const builder = createQueryBuilder(dialect);
|
|
273
|
-
expect(builder.build(def)).toMatchSql(expected.
|
|
246
|
+
expect(builder.build(def)).toMatchSql(expected.coalesceMultiple[dialect]);
|
|
274
247
|
});
|
|
275
248
|
});
|
|
276
249
|
});
|
package/tests/expr/date.spec.ts
CHANGED
|
@@ -41,15 +41,6 @@ describe("Expr - Date/Time functions", () => {
|
|
|
41
41
|
}))
|
|
42
42
|
.getSelectQueryDef();
|
|
43
43
|
|
|
44
|
-
it("Verify QueryDef", () => {
|
|
45
|
-
expect(def.select).toMatchObject({
|
|
46
|
-
monthPart: {
|
|
47
|
-
type: "month",
|
|
48
|
-
arg: { type: "column", path: ["T1", "createdAt"] },
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
44
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
54
45
|
const builder = createQueryBuilder(dialect);
|
|
55
46
|
expect(builder.build(def)).toMatchSql(expected.month[dialect]);
|
|
@@ -65,15 +56,6 @@ describe("Expr - Date/Time functions", () => {
|
|
|
65
56
|
}))
|
|
66
57
|
.getSelectQueryDef();
|
|
67
58
|
|
|
68
|
-
it("Verify QueryDef", () => {
|
|
69
|
-
expect(def.select).toMatchObject({
|
|
70
|
-
dayPart: {
|
|
71
|
-
type: "day",
|
|
72
|
-
arg: { type: "column", path: ["T1", "createdAt"] },
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
|
|
77
59
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
78
60
|
const builder = createQueryBuilder(dialect);
|
|
79
61
|
expect(builder.build(def)).toMatchSql(expected.day[dialect]);
|
|
@@ -89,15 +71,6 @@ describe("Expr - Date/Time functions", () => {
|
|
|
89
71
|
}))
|
|
90
72
|
.getSelectQueryDef();
|
|
91
73
|
|
|
92
|
-
it("Verify QueryDef", () => {
|
|
93
|
-
expect(def.select).toMatchObject({
|
|
94
|
-
hourPart: {
|
|
95
|
-
type: "hour",
|
|
96
|
-
arg: { type: "column", path: ["T1", "createdAt"] },
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
|
|
101
74
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
102
75
|
const builder = createQueryBuilder(dialect);
|
|
103
76
|
expect(builder.build(def)).toMatchSql(expected.hour[dialect]);
|
|
@@ -113,15 +86,6 @@ describe("Expr - Date/Time functions", () => {
|
|
|
113
86
|
}))
|
|
114
87
|
.getSelectQueryDef();
|
|
115
88
|
|
|
116
|
-
it("Verify QueryDef", () => {
|
|
117
|
-
expect(def.select).toMatchObject({
|
|
118
|
-
minutePart: {
|
|
119
|
-
type: "minute",
|
|
120
|
-
arg: { type: "column", path: ["T1", "createdAt"] },
|
|
121
|
-
},
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
|
|
125
89
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
126
90
|
const builder = createQueryBuilder(dialect);
|
|
127
91
|
expect(builder.build(def)).toMatchSql(expected.minute[dialect]);
|
|
@@ -137,15 +101,6 @@ describe("Expr - Date/Time functions", () => {
|
|
|
137
101
|
}))
|
|
138
102
|
.getSelectQueryDef();
|
|
139
103
|
|
|
140
|
-
it("Verify QueryDef", () => {
|
|
141
|
-
expect(def.select).toMatchObject({
|
|
142
|
-
secondPart: {
|
|
143
|
-
type: "second",
|
|
144
|
-
arg: { type: "column", path: ["T1", "createdAt"] },
|
|
145
|
-
},
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
|
|
149
104
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
150
105
|
const builder = createQueryBuilder(dialect);
|
|
151
106
|
expect(builder.build(def)).toMatchSql(expected.second[dialect]);
|
|
@@ -166,7 +121,7 @@ describe("Expr - Date/Time functions", () => {
|
|
|
166
121
|
expect(def.select).toMatchObject({
|
|
167
122
|
daysDiff: {
|
|
168
123
|
type: "dateDiff",
|
|
169
|
-
|
|
124
|
+
unit: "day",
|
|
170
125
|
from: { type: "column", path: ["T1", "createdAt"] },
|
|
171
126
|
to: { type: "value", value: targetDate },
|
|
172
127
|
},
|
|
@@ -189,17 +144,6 @@ describe("Expr - Date/Time functions", () => {
|
|
|
189
144
|
}))
|
|
190
145
|
.getSelectQueryDef();
|
|
191
146
|
|
|
192
|
-
it("Verify QueryDef", () => {
|
|
193
|
-
expect(def.select).toMatchObject({
|
|
194
|
-
yearsDiff: {
|
|
195
|
-
type: "dateDiff",
|
|
196
|
-
separator: "year",
|
|
197
|
-
from: { type: "column", path: ["T1", "createdAt"] },
|
|
198
|
-
to: { type: "value", value: targetDate },
|
|
199
|
-
},
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
|
|
203
147
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
204
148
|
const builder = createQueryBuilder(dialect);
|
|
205
149
|
expect(builder.build(def)).toMatchSql(expected.dateDiffYear[dialect]);
|
|
@@ -216,17 +160,6 @@ describe("Expr - Date/Time functions", () => {
|
|
|
216
160
|
}))
|
|
217
161
|
.getSelectQueryDef();
|
|
218
162
|
|
|
219
|
-
it("Verify QueryDef", () => {
|
|
220
|
-
expect(def.select).toMatchObject({
|
|
221
|
-
monthsDiff: {
|
|
222
|
-
type: "dateDiff",
|
|
223
|
-
separator: "month",
|
|
224
|
-
from: { type: "column", path: ["T1", "createdAt"] },
|
|
225
|
-
to: { type: "value", value: targetDate },
|
|
226
|
-
},
|
|
227
|
-
});
|
|
228
|
-
});
|
|
229
|
-
|
|
230
163
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
231
164
|
const builder = createQueryBuilder(dialect);
|
|
232
165
|
expect(builder.build(def)).toMatchSql(expected.dateDiffMonth[dialect]);
|
|
@@ -247,7 +180,7 @@ describe("Expr - Date/Time functions", () => {
|
|
|
247
180
|
expect(def.select).toMatchObject({
|
|
248
181
|
hoursDiff: {
|
|
249
182
|
type: "dateDiff",
|
|
250
|
-
|
|
183
|
+
unit: "hour",
|
|
251
184
|
from: { type: "column", path: ["T1", "createdAt"] },
|
|
252
185
|
to: { type: "value", value: targetDate },
|
|
253
186
|
},
|
|
@@ -274,7 +207,7 @@ describe("Expr - Date/Time functions", () => {
|
|
|
274
207
|
expect(def.select).toMatchObject({
|
|
275
208
|
minutesDiff: {
|
|
276
209
|
type: "dateDiff",
|
|
277
|
-
|
|
210
|
+
unit: "minute",
|
|
278
211
|
from: { type: "column", path: ["T1", "createdAt"] },
|
|
279
212
|
to: { type: "value", value: targetDate },
|
|
280
213
|
},
|
|
@@ -301,7 +234,7 @@ describe("Expr - Date/Time functions", () => {
|
|
|
301
234
|
expect(def.select).toMatchObject({
|
|
302
235
|
secondsDiff: {
|
|
303
236
|
type: "dateDiff",
|
|
304
|
-
|
|
237
|
+
unit: "second",
|
|
305
238
|
from: { type: "column", path: ["T1", "createdAt"] },
|
|
306
239
|
to: { type: "value", value: targetDate },
|
|
307
240
|
},
|
|
@@ -327,7 +260,7 @@ describe("Expr - Date/Time functions", () => {
|
|
|
327
260
|
expect(def.select).toMatchObject({
|
|
328
261
|
nextMonth: {
|
|
329
262
|
type: "dateAdd",
|
|
330
|
-
|
|
263
|
+
unit: "month",
|
|
331
264
|
source: { type: "column", path: ["T1", "createdAt"] },
|
|
332
265
|
value: { type: "value", value: 1 },
|
|
333
266
|
},
|
package/tests/expr/math.spec.ts
CHANGED
|
@@ -56,51 +56,4 @@ describe("Expr - Math functions", () => {
|
|
|
56
56
|
});
|
|
57
57
|
});
|
|
58
58
|
|
|
59
|
-
describe("ceil - ceiling", () => {
|
|
60
|
-
const db = createTestDb();
|
|
61
|
-
const def = db
|
|
62
|
-
.user()
|
|
63
|
-
.select((item) => ({
|
|
64
|
-
ceiled: expr.ceil(item.age),
|
|
65
|
-
}))
|
|
66
|
-
.getSelectQueryDef();
|
|
67
|
-
|
|
68
|
-
it("Verify QueryDef", () => {
|
|
69
|
-
expect(def.select).toMatchObject({
|
|
70
|
-
ceiled: {
|
|
71
|
-
type: "ceil",
|
|
72
|
-
arg: { type: "column", path: ["T1", "age"] },
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
78
|
-
const builder = createQueryBuilder(dialect);
|
|
79
|
-
expect(builder.build(def)).toMatchSql(expected.ceil[dialect]);
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
describe("floor - flooring", () => {
|
|
84
|
-
const db = createTestDb();
|
|
85
|
-
const def = db
|
|
86
|
-
.user()
|
|
87
|
-
.select((item) => ({
|
|
88
|
-
floored: expr.floor(item.age),
|
|
89
|
-
}))
|
|
90
|
-
.getSelectQueryDef();
|
|
91
|
-
|
|
92
|
-
it("Verify QueryDef", () => {
|
|
93
|
-
expect(def.select).toMatchObject({
|
|
94
|
-
floored: {
|
|
95
|
-
type: "floor",
|
|
96
|
-
arg: { type: "column", path: ["T1", "age"] },
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
102
|
-
const builder = createQueryBuilder(dialect);
|
|
103
|
-
expect(builder.build(def)).toMatchSql(expected.floor[dialect]);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
59
|
});
|
|
@@ -68,15 +68,6 @@ describe("Expr - String functions", () => {
|
|
|
68
68
|
}))
|
|
69
69
|
.getSelectQueryDef();
|
|
70
70
|
|
|
71
|
-
it("Verify QueryDef", () => {
|
|
72
|
-
expect(def.select).toMatchObject({
|
|
73
|
-
byteLen: {
|
|
74
|
-
type: "byteLength",
|
|
75
|
-
arg: { type: "column", path: ["T1", "name"] },
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
|
|
80
71
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
81
72
|
const builder = createQueryBuilder(dialect);
|
|
82
73
|
expect(builder.build(def)).toMatchSql(expected.byteLength[dialect]);
|
|
@@ -117,16 +108,6 @@ describe("Expr - String functions", () => {
|
|
|
117
108
|
}))
|
|
118
109
|
.getSelectQueryDef();
|
|
119
110
|
|
|
120
|
-
it("Verify QueryDef", () => {
|
|
121
|
-
expect(def.select).toMatchObject({
|
|
122
|
-
suffix: {
|
|
123
|
-
type: "right",
|
|
124
|
-
source: { type: "column", path: ["T1", "name"] },
|
|
125
|
-
length: { type: "value", value: 3 },
|
|
126
|
-
},
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
|
|
130
111
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
131
112
|
const builder = createQueryBuilder(dialect);
|
|
132
113
|
expect(builder.build(def)).toMatchSql(expected.right[dialect]);
|
|
@@ -142,15 +123,6 @@ describe("Expr - String functions", () => {
|
|
|
142
123
|
}))
|
|
143
124
|
.getSelectQueryDef();
|
|
144
125
|
|
|
145
|
-
it("Verify QueryDef", () => {
|
|
146
|
-
expect(def.select).toMatchObject({
|
|
147
|
-
trimmed: {
|
|
148
|
-
type: "trim",
|
|
149
|
-
arg: { type: "column", path: ["T1", "name"] },
|
|
150
|
-
},
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
|
|
154
126
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
155
127
|
const builder = createQueryBuilder(dialect);
|
|
156
128
|
expect(builder.build(def)).toMatchSql(expected.trim[dialect]);
|
|
@@ -218,15 +190,6 @@ describe("Expr - String functions", () => {
|
|
|
218
190
|
}))
|
|
219
191
|
.getSelectQueryDef();
|
|
220
192
|
|
|
221
|
-
it("Verify QueryDef", () => {
|
|
222
|
-
expect(def.select).toMatchObject({
|
|
223
|
-
upper: {
|
|
224
|
-
type: "upper",
|
|
225
|
-
arg: { type: "column", path: ["T1", "name"] },
|
|
226
|
-
},
|
|
227
|
-
});
|
|
228
|
-
});
|
|
229
|
-
|
|
230
193
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
231
194
|
const builder = createQueryBuilder(dialect);
|
|
232
195
|
expect(builder.build(def)).toMatchSql(expected.upper[dialect]);
|
|
@@ -242,15 +205,6 @@ describe("Expr - String functions", () => {
|
|
|
242
205
|
}))
|
|
243
206
|
.getSelectQueryDef();
|
|
244
207
|
|
|
245
|
-
it("Verify QueryDef", () => {
|
|
246
|
-
expect(def.select).toMatchObject({
|
|
247
|
-
lower: {
|
|
248
|
-
type: "lower",
|
|
249
|
-
arg: { type: "column", path: ["T1", "name"] },
|
|
250
|
-
},
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
|
|
254
208
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
255
209
|
const builder = createQueryBuilder(dialect);
|
|
256
210
|
expect(builder.build(def)).toMatchSql(expected.lower[dialect]);
|
|
@@ -338,16 +292,6 @@ describe("Expr - String functions", () => {
|
|
|
338
292
|
.where((item) => [expr.like(item.name, "%\\%%")])
|
|
339
293
|
.getSelectQueryDef();
|
|
340
294
|
|
|
341
|
-
it("Verify QueryDef", () => {
|
|
342
|
-
expect(def.where).toEqual([
|
|
343
|
-
{
|
|
344
|
-
type: "like",
|
|
345
|
-
source: { type: "column", path: ["T1", "name"] },
|
|
346
|
-
pattern: { type: "value", value: "%\\%%" },
|
|
347
|
-
},
|
|
348
|
-
]);
|
|
349
|
-
});
|
|
350
|
-
|
|
351
295
|
it.each(dialects)("[%s] Verify SQL", (dialect) => {
|
|
352
296
|
const builder = createQueryBuilder(dialect);
|
|
353
297
|
expect(builder.build(def)).toMatchSql(expected.likeEscape[dialect]);
|