velocious 1.0.112 → 1.0.114
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/dist/src/database/query/index.d.ts +46 -120
- package/dist/src/database/query/index.d.ts.map +1 -1
- package/dist/src/database/query/index.js +31 -219
- package/dist/src/database/query/join-object.d.ts.map +1 -1
- package/dist/src/database/query/join-object.js +7 -2
- package/dist/src/database/query/model-class-query.d.ts +77 -0
- package/dist/src/database/query/model-class-query.d.ts.map +1 -0
- package/dist/src/database/query/model-class-query.js +212 -0
- package/dist/src/database/query-parser/select-parser.d.ts.map +1 -1
- package/dist/src/database/query-parser/select-parser.js +3 -1
- package/dist/src/database/record/index.d.ts +42 -67
- package/dist/src/database/record/index.d.ts.map +1 -1
- package/dist/src/database/record/index.js +33 -57
- package/dist/src/database/record/instance-relationships/base.d.ts +35 -24
- package/dist/src/database/record/instance-relationships/base.d.ts.map +1 -1
- package/dist/src/database/record/instance-relationships/base.js +24 -11
- package/dist/src/database/record/instance-relationships/belongs-to.d.ts +11 -1
- package/dist/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
- package/dist/src/database/record/instance-relationships/belongs-to.js +14 -3
- package/dist/src/database/record/instance-relationships/has-many.d.ts +23 -3
- package/dist/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
- package/dist/src/database/record/instance-relationships/has-many.js +16 -4
- package/dist/src/database/record/instance-relationships/has-one.d.ts +21 -4
- package/dist/src/database/record/instance-relationships/has-one.d.ts.map +1 -1
- package/dist/src/database/record/instance-relationships/has-one.js +19 -8
- package/dist/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
- package/dist/src/environment-handlers/node/cli/commands/generate/base-models.js +26 -10
- package/package.json +1 -1
|
@@ -1,44 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* @typedef {{[key: string]: boolean | NestedPreloadRecord }} NestedPreloadRecord
|
|
3
|
+
* @typedef {string | string[] | import("./select-base.js").default | import("./select-base.js").default[]} SelectArgumentType
|
|
4
|
+
* @typedef {object | string} WhereArgumentType
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {object} QueryArgsType
|
|
8
|
+
* @property {import("../drivers/base.js").default} driver
|
|
9
|
+
* @property {Array<import("./from-base.js").default>} [froms]
|
|
10
|
+
* @property {string[]} [groups]
|
|
11
|
+
* @property {Array<import("./join-base.js").default>} [joins]
|
|
12
|
+
* @property {import("../handler.js").default} handler
|
|
13
|
+
* @property {number | null} [limit]
|
|
14
|
+
* @property {number | null} [offset]
|
|
15
|
+
* @property {Array<import("./order-base.js").default>} [orders]
|
|
16
|
+
* @property {number | null} [page]
|
|
17
|
+
* @property {number} [perPage]
|
|
18
|
+
* @property {NestedPreloadRecord} [preload]
|
|
19
|
+
* @property {Array<import("./select-base.js").default>} [selects]
|
|
20
|
+
* @property {Array<import("./where-base.js").default>} [wheres]
|
|
3
21
|
*/
|
|
4
22
|
export default class VelociousDatabaseQuery {
|
|
5
23
|
/**
|
|
6
|
-
* @param {
|
|
7
|
-
* @param {import("../drivers/base.js").default} args.driver
|
|
8
|
-
* @param {Array<import("./from-base.js").default>} [args.froms]
|
|
9
|
-
* @param {string[]} [args.groups]
|
|
10
|
-
* @param {Array<import("./join-base.js").default>} [args.joins]
|
|
11
|
-
* @param {import("../handler.js").default} args.handler
|
|
12
|
-
* @param {number | null} [args.limit]
|
|
13
|
-
* @param {typeof import("../record/index.js").default} [args.modelClass]
|
|
14
|
-
* @param {number | null} [args.offset]
|
|
15
|
-
* @param {Array<import("./order-base.js").default>} [args.orders]
|
|
16
|
-
* @param {number | null} [args.page]
|
|
17
|
-
* @param {number} [args.perPage]
|
|
18
|
-
* @param {NestedPreloadRecord} [args.preload]
|
|
19
|
-
* @param {Array<import("./select-base.js").default>} [args.selects]
|
|
20
|
-
* @param {Array<import("./where-base.js").default>} [args.wheres]
|
|
24
|
+
* @param {QueryArgsType} args
|
|
21
25
|
*/
|
|
22
|
-
constructor({ driver, froms, groups, joins, handler, limit,
|
|
23
|
-
driver: import("../drivers/base.js").default;
|
|
24
|
-
froms?: Array<import("./from-base.js").default>;
|
|
25
|
-
groups?: string[];
|
|
26
|
-
joins?: Array<import("./join-base.js").default>;
|
|
27
|
-
handler: import("../handler.js").default;
|
|
28
|
-
limit?: number | null;
|
|
29
|
-
modelClass?: typeof import("../record/index.js").default;
|
|
30
|
-
offset?: number | null;
|
|
31
|
-
orders?: Array<import("./order-base.js").default>;
|
|
32
|
-
page?: number | null;
|
|
33
|
-
perPage?: number;
|
|
34
|
-
preload?: NestedPreloadRecord;
|
|
35
|
-
selects?: Array<import("./select-base.js").default>;
|
|
36
|
-
wheres?: Array<import("./where-base.js").default>;
|
|
37
|
-
});
|
|
26
|
+
constructor({ driver, froms, groups, joins, handler, limit, offset, orders, page, perPage, preload, selects, wheres }: QueryArgsType);
|
|
38
27
|
driver: import("../drivers/base.js").default;
|
|
39
28
|
handler: import("../handler.js").default;
|
|
40
29
|
logger: Logger;
|
|
41
|
-
modelClass: typeof import("../record/index.js").default;
|
|
42
30
|
_froms: import("./from-base.js").default[];
|
|
43
31
|
_groups: string[];
|
|
44
32
|
_joins: import("./join-base.js").default[];
|
|
@@ -51,75 +39,16 @@ export default class VelociousDatabaseQuery {
|
|
|
51
39
|
_selects: SelectBase[];
|
|
52
40
|
/** @type {import("./where-base.js").default[]} */
|
|
53
41
|
_wheres: import("./where-base.js").default[];
|
|
54
|
-
/**
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
clone(): VelociousDatabaseQuery;
|
|
58
|
-
/**
|
|
59
|
-
* @returns {Promise<number>}
|
|
60
|
-
*/
|
|
61
|
-
count(): Promise<number>;
|
|
62
|
-
/**
|
|
63
|
-
* @returns {import("./from-base.js").default[]}
|
|
64
|
-
*/
|
|
42
|
+
/** @returns {this} */
|
|
43
|
+
clone(): this;
|
|
44
|
+
/** @returns {import("./from-base.js").default[]} */
|
|
65
45
|
getFroms(): import("./from-base.js").default[];
|
|
66
|
-
/**
|
|
67
|
-
* @returns {string[]}
|
|
68
|
-
*/
|
|
46
|
+
/** @returns {string[]} */
|
|
69
47
|
getGroups(): string[];
|
|
70
|
-
/**
|
|
71
|
-
* @returns {typeof import("../record/index.js").default}
|
|
72
|
-
*/
|
|
73
|
-
getModelClass(): typeof import("../record/index.js").default;
|
|
74
|
-
/**
|
|
75
|
-
* @returns {import("../query-parser/options.js").default}
|
|
76
|
-
*/
|
|
48
|
+
/** @returns {import("../query-parser/options.js").default} */
|
|
77
49
|
getOptions(): import("../query-parser/options.js").default;
|
|
78
|
-
/**
|
|
79
|
-
* @returns {Array<import("./select-base.js").default>}
|
|
80
|
-
*/
|
|
50
|
+
/** @returns {Array<import("./select-base.js").default>} */
|
|
81
51
|
getSelects(): Array<import("./select-base.js").default>;
|
|
82
|
-
/**
|
|
83
|
-
* @returns {Promise<void>}
|
|
84
|
-
*/
|
|
85
|
-
destroyAll(): Promise<void>;
|
|
86
|
-
/**
|
|
87
|
-
* @param {number|string} recordId
|
|
88
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
89
|
-
*/
|
|
90
|
-
find(recordId: number | string): Promise<import("../record/index.js").default>;
|
|
91
|
-
/**
|
|
92
|
-
* @param {{[key: string]: any}} conditions
|
|
93
|
-
* @returns {Promise<import("../record/index.js").default|null>}
|
|
94
|
-
*/
|
|
95
|
-
findBy(conditions: {
|
|
96
|
-
[key: string]: any;
|
|
97
|
-
}): Promise<import("../record/index.js").default | null>;
|
|
98
|
-
/**
|
|
99
|
-
* @param {{[key: string]: any}} conditions
|
|
100
|
-
* @param {function() : void} callback
|
|
101
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
102
|
-
*/
|
|
103
|
-
findOrCreateBy(conditions: {
|
|
104
|
-
[key: string]: any;
|
|
105
|
-
}, callback: () => void): Promise<import("../record/index.js").default>;
|
|
106
|
-
/**
|
|
107
|
-
* @param {{[key: string]: any}} conditions
|
|
108
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
109
|
-
*/
|
|
110
|
-
findByOrFail(conditions: {
|
|
111
|
-
[key: string]: any;
|
|
112
|
-
}): Promise<import("../record/index.js").default>;
|
|
113
|
-
/**
|
|
114
|
-
* @param {object} conditions
|
|
115
|
-
* @param {function(import("../record/index.js").default) : void} callback
|
|
116
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
117
|
-
*/
|
|
118
|
-
findOrInitializeBy(conditions: object, callback: (arg0: import("../record/index.js").default) => void): Promise<import("../record/index.js").default>;
|
|
119
|
-
/**
|
|
120
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
121
|
-
*/
|
|
122
|
-
first(): Promise<import("../record/index.js").default>;
|
|
123
52
|
/**
|
|
124
53
|
* @param {string|import("./from-base.js").default} from
|
|
125
54
|
* @returns {this}
|
|
@@ -137,10 +66,6 @@ export default class VelociousDatabaseQuery {
|
|
|
137
66
|
joins(join: string | {
|
|
138
67
|
[key: string]: any;
|
|
139
68
|
}): this;
|
|
140
|
-
/**
|
|
141
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
142
|
-
*/
|
|
143
|
-
last(): Promise<import("../record/index.js").default>;
|
|
144
69
|
/**
|
|
145
70
|
* @param {number} value
|
|
146
71
|
* @returns {this}
|
|
@@ -166,19 +91,12 @@ export default class VelociousDatabaseQuery {
|
|
|
166
91
|
* @returns {this}
|
|
167
92
|
*/
|
|
168
93
|
perPage(perPage: number): this;
|
|
169
|
-
/**
|
|
170
|
-
* @param {NestedPreloadRecord} data
|
|
171
|
-
* @returns {this}
|
|
172
|
-
*/
|
|
173
|
-
preload(data: NestedPreloadRecord): this;
|
|
174
94
|
/**
|
|
175
95
|
* @param {string | number} order
|
|
176
96
|
* @returns {this}
|
|
177
97
|
*/
|
|
178
98
|
reorder(order: string | number): this;
|
|
179
|
-
/**
|
|
180
|
-
* @returns {this}
|
|
181
|
-
*/
|
|
99
|
+
/** @returns {this} */
|
|
182
100
|
reverseOrder(): this;
|
|
183
101
|
/**
|
|
184
102
|
* @param {SelectArgumentType} select
|
|
@@ -189,15 +107,8 @@ export default class VelociousDatabaseQuery {
|
|
|
189
107
|
* @returns {Promise<Array<object>>} Array of results from the database
|
|
190
108
|
*/
|
|
191
109
|
_executeQuery(): Promise<Array<object>>;
|
|
192
|
-
/**
|
|
193
|
-
* @returns {Promise<Array<object>>} Array of results from the database
|
|
194
|
-
*/
|
|
110
|
+
/** @returns {Promise<Array<object>>} Array of results from the database */
|
|
195
111
|
results(): Promise<Array<object>>;
|
|
196
|
-
/**
|
|
197
|
-
* Converts query results to array of model instances
|
|
198
|
-
* @returns {Promise<Array<import("../record/index.js").default>>}
|
|
199
|
-
*/
|
|
200
|
-
toArray(): Promise<Array<import("../record/index.js").default>>;
|
|
201
112
|
/**
|
|
202
113
|
* Generates SQL string representing this query
|
|
203
114
|
* @returns {string} SQL string representing this query
|
|
@@ -205,15 +116,30 @@ export default class VelociousDatabaseQuery {
|
|
|
205
116
|
toSql(): string;
|
|
206
117
|
/**
|
|
207
118
|
* @param {WhereArgumentType} where
|
|
208
|
-
* @returns {
|
|
119
|
+
* @returns {this} This query instance
|
|
209
120
|
*/
|
|
210
|
-
where(where: WhereArgumentType):
|
|
121
|
+
where(where: WhereArgumentType): this;
|
|
211
122
|
}
|
|
212
123
|
export type NestedPreloadRecord = {
|
|
213
124
|
[key: string]: boolean | NestedPreloadRecord;
|
|
214
125
|
};
|
|
215
126
|
export type SelectArgumentType = string | string[] | import("./select-base.js").default | import("./select-base.js").default[];
|
|
216
127
|
export type WhereArgumentType = object | string;
|
|
128
|
+
export type QueryArgsType = {
|
|
129
|
+
driver: import("../drivers/base.js").default;
|
|
130
|
+
froms?: Array<import("./from-base.js").default>;
|
|
131
|
+
groups?: string[];
|
|
132
|
+
joins?: Array<import("./join-base.js").default>;
|
|
133
|
+
handler: import("../handler.js").default;
|
|
134
|
+
limit?: number | null;
|
|
135
|
+
offset?: number | null;
|
|
136
|
+
orders?: Array<import("./order-base.js").default>;
|
|
137
|
+
page?: number | null;
|
|
138
|
+
perPage?: number;
|
|
139
|
+
preload?: NestedPreloadRecord;
|
|
140
|
+
selects?: Array<import("./select-base.js").default>;
|
|
141
|
+
wheres?: Array<import("./where-base.js").default>;
|
|
142
|
+
};
|
|
217
143
|
import { Logger } from "../../logger.js";
|
|
218
144
|
import SelectBase from "./select-base.js";
|
|
219
145
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/database/query/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/database/query/index.js"],"names":[],"mappings":"AAaA;;;;GAIG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH;IACE;;OAEG;IACH,uHAFW,aAAa,EAoCvB;IAhBC,6CAAoB;IACpB,yCAAsB;IACtB,eAA8B;IAC9B,2CAAmB;IACnB,kBAAqB;IACrB,2CAAmB;IACnB,eAAmB;IACnB,gBAAqB;IACrB,6CAAqB;IACrB,cAAiB;IACjB,iBAAuB;IACvB,8BAAuB;IACvB,uBAAuB;IAEvB,kDAAkD;IAClD,SADW,OAAO,iBAAiB,EAAE,OAAO,EAAE,CACzB;IAGvB,sBAAsB;IACtB,SADc,IAAI,CAoBjB;IAED,oDAAoD;IACpD,YADc,OAAO,gBAAgB,EAAE,OAAO,EAAE,CAG/C;IAED,0BAA0B;IAC1B,aADc,MAAM,EAAE,CAGrB;IAED,8DAA8D;IAC9D,cADc,OAAO,4BAA4B,EAAE,OAAO,CACb;IAE7C,2DAA2D;IAC3D,cADc,KAAK,CAAC,OAAO,kBAAkB,EAAE,OAAO,CAAC,CAClB;IAErC;;;OAGG;IACH,WAHW,MAAM,GAAC,OAAO,gBAAgB,EAAE,OAAO,GACrC,IAAI,CAOhB;IAED;;;OAGG;IACH,aAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;OAGG;IACH,YAHW,MAAM,GAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC,GACzB,IAAI,CAYhB;IAED;;;OAGG;IACH,aAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;OAGG;IACH,cAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;OAGG;IACH,aAHW,MAAM,GAAG,MAAM,GACb,IAAI,CAYhB;IAED;;;OAGG;IACH,iBAHW,MAAM,GACJ,IAAI,CAWhB;IAED;;;OAGG;IACH,iBAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;OAGG;IACH,eAHW,MAAM,GAAG,MAAM,GACb,IAAI,CAMhB;IAED,sBAAsB;IACtB,gBADc,IAAI,CAOjB;IAED;;;OAGG;IACH,eAHW,kBAAkB,GAChB,IAAI,CAoBhB;IAED;;OAEG;IACH,iBAFa,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CASlC;IAED,2EAA2E;IAC3E,WADc,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAGnC;IAED;;;OAGG;IACH,SAFa,MAAM,CAE4B;IAE/C;;;OAGG;IACH,aAHW,iBAAiB,GACf,IAAI,CAYhB;CACF;kCAnRY;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,mBAAmB,CAAA;CAAE;iCAC/C,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,kBAAkB,EAAE,OAAO,GAAG,OAAO,kBAAkB,EAAE,OAAO,EAAE;gCAC7F,MAAM,GAAG,MAAM;;YAKd,OAAO,oBAAoB,EAAE,OAAO;YACpC,KAAK,CAAC,OAAO,gBAAgB,EAAE,OAAO,CAAC;aACvC,MAAM,EAAE;YACR,KAAK,CAAC,OAAO,gBAAgB,EAAE,OAAO,CAAC;aACvC,OAAO,eAAe,EAAE,OAAO;YAC/B,MAAM,GAAG,IAAI;aACb,MAAM,GAAG,IAAI;aACb,KAAK,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC;WACxC,MAAM,GAAG,IAAI;cACb,MAAM;cACN,mBAAmB;cACnB,KAAK,CAAC,OAAO,kBAAkB,EAAE,OAAO,CAAC;aACzC,KAAK,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC;;uBA3BjC,iBAAiB;uBAEf,kBAAkB"}
|
|
@@ -1,55 +1,47 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
/**
|
|
3
|
-
* @typedef {{[key: string]: boolean | NestedPreloadRecord }} NestedPreloadRecord
|
|
4
|
-
* @typedef {string | string[] | import("./select-base.js").default | import("./select-base.js").default[]} SelectArgumentType
|
|
5
|
-
* @typedef {object | string} WhereArgumentType
|
|
6
|
-
*/
|
|
7
2
|
import FromPlain from "./from-plain.js";
|
|
8
|
-
import { incorporate } from "incorporator";
|
|
9
|
-
import * as inflection from "inflection";
|
|
10
3
|
import { isPlainObject } from "is-plain-object";
|
|
11
4
|
import JoinObject from "./join-object.js";
|
|
12
5
|
import JoinPlain from "./join-plain.js";
|
|
13
6
|
import { Logger } from "../../logger.js";
|
|
14
7
|
import OrderPlain from "./order-plain.js";
|
|
15
|
-
import Preloader from "./preloader.js";
|
|
16
|
-
import RecordNotFoundError from "../record/record-not-found-error.js";
|
|
17
8
|
import SelectBase from "./select-base.js";
|
|
18
9
|
import SelectPlain from "./select-plain.js";
|
|
19
10
|
import WhereHash from "./where-hash.js";
|
|
20
11
|
import WherePlain from "./where-plain.js";
|
|
21
|
-
import restArgsError from "../../utils/rest-args-error.js";
|
|
22
12
|
/**
|
|
23
|
-
*
|
|
13
|
+
* @typedef {{[key: string]: boolean | NestedPreloadRecord }} NestedPreloadRecord
|
|
14
|
+
* @typedef {string | string[] | import("./select-base.js").default | import("./select-base.js").default[]} SelectArgumentType
|
|
15
|
+
* @typedef {object | string} WhereArgumentType
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* @typedef {object} QueryArgsType
|
|
19
|
+
* @property {import("../drivers/base.js").default} driver
|
|
20
|
+
* @property {Array<import("./from-base.js").default>} [froms]
|
|
21
|
+
* @property {string[]} [groups]
|
|
22
|
+
* @property {Array<import("./join-base.js").default>} [joins]
|
|
23
|
+
* @property {import("../handler.js").default} handler
|
|
24
|
+
* @property {number | null} [limit]
|
|
25
|
+
* @property {number | null} [offset]
|
|
26
|
+
* @property {Array<import("./order-base.js").default>} [orders]
|
|
27
|
+
* @property {number | null} [page]
|
|
28
|
+
* @property {number} [perPage]
|
|
29
|
+
* @property {NestedPreloadRecord} [preload]
|
|
30
|
+
* @property {Array<import("./select-base.js").default>} [selects]
|
|
31
|
+
* @property {Array<import("./where-base.js").default>} [wheres]
|
|
24
32
|
*/
|
|
25
33
|
export default class VelociousDatabaseQuery {
|
|
26
34
|
/**
|
|
27
|
-
* @param {
|
|
28
|
-
* @param {import("../drivers/base.js").default} args.driver
|
|
29
|
-
* @param {Array<import("./from-base.js").default>} [args.froms]
|
|
30
|
-
* @param {string[]} [args.groups]
|
|
31
|
-
* @param {Array<import("./join-base.js").default>} [args.joins]
|
|
32
|
-
* @param {import("../handler.js").default} args.handler
|
|
33
|
-
* @param {number | null} [args.limit]
|
|
34
|
-
* @param {typeof import("../record/index.js").default} [args.modelClass]
|
|
35
|
-
* @param {number | null} [args.offset]
|
|
36
|
-
* @param {Array<import("./order-base.js").default>} [args.orders]
|
|
37
|
-
* @param {number | null} [args.page]
|
|
38
|
-
* @param {number} [args.perPage]
|
|
39
|
-
* @param {NestedPreloadRecord} [args.preload]
|
|
40
|
-
* @param {Array<import("./select-base.js").default>} [args.selects]
|
|
41
|
-
* @param {Array<import("./where-base.js").default>} [args.wheres]
|
|
35
|
+
* @param {QueryArgsType} args
|
|
42
36
|
*/
|
|
43
|
-
constructor({ driver, froms = [], groups = [], joins = [], handler, limit = null,
|
|
37
|
+
constructor({ driver, froms = [], groups = [], joins = [], handler, limit = null, offset = null, orders = [], page = null, perPage, preload = {}, selects = [], wheres = [] }) {
|
|
44
38
|
if (!driver)
|
|
45
39
|
throw new Error("No driver given to query");
|
|
46
40
|
if (!handler)
|
|
47
41
|
throw new Error("No handler given to query");
|
|
48
|
-
restArgsError(restArgs);
|
|
49
42
|
this.driver = driver;
|
|
50
43
|
this.handler = handler;
|
|
51
44
|
this.logger = new Logger(this);
|
|
52
|
-
this.modelClass = modelClass;
|
|
53
45
|
this._froms = froms;
|
|
54
46
|
this._groups = groups;
|
|
55
47
|
this._joins = joins;
|
|
@@ -63,18 +55,16 @@ export default class VelociousDatabaseQuery {
|
|
|
63
55
|
/** @type {import("./where-base.js").default[]} */
|
|
64
56
|
this._wheres = wheres;
|
|
65
57
|
}
|
|
66
|
-
/**
|
|
67
|
-
* @returns {VelociousDatabaseQuery}
|
|
68
|
-
*/
|
|
58
|
+
/** @returns {this} */
|
|
69
59
|
clone() {
|
|
70
|
-
const
|
|
60
|
+
const QueryClass = /** @type {new (args: QueryArgsType) => this} */ (this.constructor);
|
|
61
|
+
const newQuery = new QueryClass({
|
|
71
62
|
driver: this.driver,
|
|
72
63
|
froms: [...this._froms],
|
|
73
64
|
handler: this.handler.clone(),
|
|
74
65
|
groups: [...this._groups],
|
|
75
66
|
joins: [...this._joins],
|
|
76
67
|
limit: this._limit,
|
|
77
|
-
modelClass: this.modelClass,
|
|
78
68
|
offset: this._offset,
|
|
79
69
|
orders: [...this._orders],
|
|
80
70
|
page: this._page,
|
|
@@ -85,152 +75,18 @@ export default class VelociousDatabaseQuery {
|
|
|
85
75
|
});
|
|
86
76
|
return newQuery;
|
|
87
77
|
}
|
|
88
|
-
/**
|
|
89
|
-
* @returns {Promise<number>}
|
|
90
|
-
*/
|
|
91
|
-
async count() {
|
|
92
|
-
// Generate count SQL
|
|
93
|
-
let sql = `COUNT(${this.driver.quoteTable(this.getModelClass().tableName())}.${this.driver.quoteColumn(this.getModelClass().primaryKey())})`;
|
|
94
|
-
if (this.driver.getType() == "pgsql")
|
|
95
|
-
sql += "::int";
|
|
96
|
-
sql += " AS count";
|
|
97
|
-
// Clone query and execute count
|
|
98
|
-
const countQuery = this.clone();
|
|
99
|
-
countQuery._selects = [];
|
|
100
|
-
countQuery.select(sql);
|
|
101
|
-
const results = /** @type {{ count: number }[]} */ (await countQuery._executeQuery());
|
|
102
|
-
// The query isn't grouped and a single result has been given
|
|
103
|
-
if (results.length == 1) {
|
|
104
|
-
return results[0].count;
|
|
105
|
-
}
|
|
106
|
-
// The query may be grouped and a lot of different counts a given
|
|
107
|
-
let countResult = 0;
|
|
108
|
-
for (const result of results) {
|
|
109
|
-
if (!("count" in result)) {
|
|
110
|
-
throw new Error("Invalid count result");
|
|
111
|
-
}
|
|
112
|
-
countResult += result.count;
|
|
113
|
-
}
|
|
114
|
-
return countResult;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* @returns {import("./from-base.js").default[]}
|
|
118
|
-
*/
|
|
78
|
+
/** @returns {import("./from-base.js").default[]} */
|
|
119
79
|
getFroms() {
|
|
120
80
|
return this._froms;
|
|
121
81
|
}
|
|
122
|
-
/**
|
|
123
|
-
* @returns {string[]}
|
|
124
|
-
*/
|
|
82
|
+
/** @returns {string[]} */
|
|
125
83
|
getGroups() {
|
|
126
84
|
return this._groups;
|
|
127
85
|
}
|
|
128
|
-
/**
|
|
129
|
-
* @returns {typeof import("../record/index.js").default}
|
|
130
|
-
*/
|
|
131
|
-
getModelClass() {
|
|
132
|
-
if (!this.modelClass)
|
|
133
|
-
throw new Error("modelClass not set");
|
|
134
|
-
return this.modelClass;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* @returns {import("../query-parser/options.js").default}
|
|
138
|
-
*/
|
|
86
|
+
/** @returns {import("../query-parser/options.js").default} */
|
|
139
87
|
getOptions() { return this.driver.options(); }
|
|
140
|
-
/**
|
|
141
|
-
* @returns {Array<import("./select-base.js").default>}
|
|
142
|
-
*/
|
|
88
|
+
/** @returns {Array<import("./select-base.js").default>} */
|
|
143
89
|
getSelects() { return this._selects; }
|
|
144
|
-
/**
|
|
145
|
-
* @returns {Promise<void>}
|
|
146
|
-
*/
|
|
147
|
-
async destroyAll() {
|
|
148
|
-
const records = await this.toArray();
|
|
149
|
-
for (const record of records) {
|
|
150
|
-
await record.destroy();
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* @param {number|string} recordId
|
|
155
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
156
|
-
*/
|
|
157
|
-
async find(recordId) {
|
|
158
|
-
/** @type {{[key: string]: number | string}} */
|
|
159
|
-
const conditions = {};
|
|
160
|
-
conditions[this.getModelClass().primaryKey()] = recordId;
|
|
161
|
-
const query = this.clone().where(conditions);
|
|
162
|
-
const record = await query.first();
|
|
163
|
-
if (!record) {
|
|
164
|
-
throw new RecordNotFoundError(`Couldn't find ${this.getModelClass().name} with '${this.getModelClass().primaryKey()}'=${recordId}`);
|
|
165
|
-
}
|
|
166
|
-
return record;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* @param {{[key: string]: any}} conditions
|
|
170
|
-
* @returns {Promise<import("../record/index.js").default|null>}
|
|
171
|
-
*/
|
|
172
|
-
async findBy(conditions) {
|
|
173
|
-
/** @type {{[key: string]: number | string}} */
|
|
174
|
-
const newConditions = {};
|
|
175
|
-
for (const key in conditions) {
|
|
176
|
-
const keyUnderscore = inflection.underscore(key);
|
|
177
|
-
newConditions[keyUnderscore] = conditions[key];
|
|
178
|
-
}
|
|
179
|
-
return await this.clone().where(newConditions).first();
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* @param {{[key: string]: any}} conditions
|
|
183
|
-
* @param {function() : void} callback
|
|
184
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
185
|
-
*/
|
|
186
|
-
async findOrCreateBy(conditions, callback) {
|
|
187
|
-
const record = await this.findOrInitializeBy(conditions, callback);
|
|
188
|
-
if (record.isNewRecord()) {
|
|
189
|
-
await record.save();
|
|
190
|
-
}
|
|
191
|
-
return record;
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* @param {{[key: string]: any}} conditions
|
|
195
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
196
|
-
*/
|
|
197
|
-
async findByOrFail(conditions) {
|
|
198
|
-
/** @type {{[key: string]: number | string}} */
|
|
199
|
-
const newConditions = {};
|
|
200
|
-
for (const key in conditions) {
|
|
201
|
-
const keyUnderscore = inflection.underscore(key);
|
|
202
|
-
newConditions[keyUnderscore] = conditions[key];
|
|
203
|
-
}
|
|
204
|
-
const model = await this.clone().where(newConditions).first();
|
|
205
|
-
if (!model) {
|
|
206
|
-
throw new Error("Record not found");
|
|
207
|
-
}
|
|
208
|
-
return model;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* @param {object} conditions
|
|
212
|
-
* @param {function(import("../record/index.js").default) : void} callback
|
|
213
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
214
|
-
*/
|
|
215
|
-
async findOrInitializeBy(conditions, callback) {
|
|
216
|
-
const record = await this.findBy(conditions);
|
|
217
|
-
if (record)
|
|
218
|
-
return record;
|
|
219
|
-
const ModelClass = this.getModelClass();
|
|
220
|
-
const newRecord = new ModelClass(conditions);
|
|
221
|
-
if (callback) {
|
|
222
|
-
callback(newRecord);
|
|
223
|
-
}
|
|
224
|
-
return newRecord;
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
228
|
-
*/
|
|
229
|
-
async first() {
|
|
230
|
-
const newQuery = this.clone().limit(1).reorder(`${this.driver.quoteTable(this.getModelClass().tableName())}.${this.driver.quoteColumn(this.getModelClass().orderableColumn())}`);
|
|
231
|
-
const results = await newQuery.toArray();
|
|
232
|
-
return results[0];
|
|
233
|
-
}
|
|
234
90
|
/**
|
|
235
91
|
* @param {string|import("./from-base.js").default} from
|
|
236
92
|
* @returns {this}
|
|
@@ -265,15 +121,6 @@ export default class VelociousDatabaseQuery {
|
|
|
265
121
|
}
|
|
266
122
|
return this;
|
|
267
123
|
}
|
|
268
|
-
/**
|
|
269
|
-
* @returns {Promise<import("../record/index.js").default>}
|
|
270
|
-
*/
|
|
271
|
-
async last() {
|
|
272
|
-
const primaryKey = this.getModelClass().primaryKey();
|
|
273
|
-
const tableName = this.getModelClass().tableName();
|
|
274
|
-
const results = await this.clone().reorder(`${this.driver.quoteTable(tableName)}.${this.driver.quoteColumn(primaryKey)} DESC`).limit(1).toArray();
|
|
275
|
-
return results[0];
|
|
276
|
-
}
|
|
277
124
|
/**
|
|
278
125
|
* @param {number} value
|
|
279
126
|
* @returns {this}
|
|
@@ -327,14 +174,6 @@ export default class VelociousDatabaseQuery {
|
|
|
327
174
|
this._perPage = perPage;
|
|
328
175
|
return this;
|
|
329
176
|
}
|
|
330
|
-
/**
|
|
331
|
-
* @param {NestedPreloadRecord} data
|
|
332
|
-
* @returns {this}
|
|
333
|
-
*/
|
|
334
|
-
preload(data) {
|
|
335
|
-
incorporate(this._preload, data);
|
|
336
|
-
return this;
|
|
337
|
-
}
|
|
338
177
|
/**
|
|
339
178
|
* @param {string | number} order
|
|
340
179
|
* @returns {this}
|
|
@@ -344,9 +183,7 @@ export default class VelociousDatabaseQuery {
|
|
|
344
183
|
this.order(order);
|
|
345
184
|
return this;
|
|
346
185
|
}
|
|
347
|
-
/**
|
|
348
|
-
* @returns {this}
|
|
349
|
-
*/
|
|
186
|
+
/** @returns {this} */
|
|
350
187
|
reverseOrder() {
|
|
351
188
|
for (const order of this._orders) {
|
|
352
189
|
order.setReverseOrder(true);
|
|
@@ -384,35 +221,10 @@ export default class VelociousDatabaseQuery {
|
|
|
384
221
|
this.logger.debug(() => ["SQL:", sql]);
|
|
385
222
|
return results;
|
|
386
223
|
}
|
|
387
|
-
/**
|
|
388
|
-
* @returns {Promise<Array<object>>} Array of results from the database
|
|
389
|
-
*/
|
|
224
|
+
/** @returns {Promise<Array<object>>} Array of results from the database */
|
|
390
225
|
async results() {
|
|
391
226
|
return await this._executeQuery();
|
|
392
227
|
}
|
|
393
|
-
/**
|
|
394
|
-
* Converts query results to array of model instances
|
|
395
|
-
* @returns {Promise<Array<import("../record/index.js").default>>}
|
|
396
|
-
*/
|
|
397
|
-
async toArray() {
|
|
398
|
-
const models = [];
|
|
399
|
-
const results = await this.results();
|
|
400
|
-
for (const result of results) {
|
|
401
|
-
const ModelClass = this.getModelClass();
|
|
402
|
-
const model = new ModelClass();
|
|
403
|
-
model.loadExistingRecord(result);
|
|
404
|
-
models.push(model);
|
|
405
|
-
}
|
|
406
|
-
if (Object.keys(this._preload).length > 0 && models.length > 0) {
|
|
407
|
-
const preloader = new Preloader({
|
|
408
|
-
modelClass: this.modelClass,
|
|
409
|
-
models,
|
|
410
|
-
preload: this._preload
|
|
411
|
-
});
|
|
412
|
-
await preloader.run();
|
|
413
|
-
}
|
|
414
|
-
return models;
|
|
415
|
-
}
|
|
416
228
|
/**
|
|
417
229
|
* Generates SQL string representing this query
|
|
418
230
|
* @returns {string} SQL string representing this query
|
|
@@ -420,7 +232,7 @@ export default class VelociousDatabaseQuery {
|
|
|
420
232
|
toSql() { return this.driver.queryToSql(this); }
|
|
421
233
|
/**
|
|
422
234
|
* @param {WhereArgumentType} where
|
|
423
|
-
* @returns {
|
|
235
|
+
* @returns {this} This query instance
|
|
424
236
|
*/
|
|
425
237
|
where(where) {
|
|
426
238
|
if (typeof where == "string") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join-object.d.ts","sourceRoot":"","sources":["../../../../src/database/query/join-object.js"],"names":[],"mappings":"AAIA;;GAEG;AAEH;IACE;;OAEG;IACH,oBAFW,UAAU,EAKpB;IADC,mBAAoB;IAGtB,
|
|
1
|
+
{"version":3,"file":"join-object.d.ts","sourceRoot":"","sources":["../../../../src/database/query/join-object.js"],"names":[],"mappings":"AAIA;;GAEG;AAEH;IACE;;OAEG;IACH,oBAFW,UAAU,EAKpB;IADC,mBAAoB;IAGtB,gBAWC;IAED;;;;;;OAMG;IACH,iBANW,UAAU,cACV,cAAc,oBAAoB,EAAE,OAAO,OAC3C,MAAM,cACN,MAAM,GACJ,MAAM,CAqClB;CACF;yBApEY;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAA;CAAC;qBAH7B,gBAAgB"}
|
|
@@ -12,8 +12,13 @@ export default class VelociousDatabaseQueryJoinObject extends JoinBase {
|
|
|
12
12
|
this.object = object;
|
|
13
13
|
}
|
|
14
14
|
toSql() {
|
|
15
|
-
const
|
|
16
|
-
|
|
15
|
+
const query = this.getQuery();
|
|
16
|
+
if (query.constructor.name != "VelociousDatabaseQueryModelClassQuery") {
|
|
17
|
+
throw new Error(`Query has to be a ModelClassQuery but was a ${query.constructor.name}`);
|
|
18
|
+
}
|
|
19
|
+
// @ts-expect-error
|
|
20
|
+
const ModelClass = /** @type {typeof import("../record/index.js").default} */ (query.modelClass);
|
|
21
|
+
return this.joinObject(this.object, ModelClass, "", 0);
|
|
17
22
|
}
|
|
18
23
|
/**
|
|
19
24
|
* @param {JoinObject} join
|