drizzle-orm 0.9.19 → 0.10.0
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 +39 -9
- package/builders/aggregators/abstractAggregator.d.ts +4 -2
- package/builders/aggregators/abstractAggregator.js +11 -4
- package/builders/aggregators/selectAggregator.d.ts +12 -4
- package/builders/aggregators/selectAggregator.js +29 -12
- package/builders/highLvlBuilders/abstractRequestBuilder.d.ts +10 -4
- package/builders/highLvlBuilders/abstractRequestBuilder.js +14 -3
- package/builders/highLvlBuilders/deleteRequestBuilder.d.ts +4 -2
- package/builders/highLvlBuilders/insertRequestBuilder.d.ts +4 -2
- package/builders/highLvlBuilders/insertRequestBuilder.js +1 -0
- package/builders/highLvlBuilders/selectRequestBuilder.d.ts +21 -16
- package/builders/highLvlBuilders/selectRequestBuilder.js +22 -11
- package/builders/highLvlBuilders/updateRequestBuilder.d.ts +4 -2
- package/builders/joinBuilders/builders/abstractJoinBuilder.d.ts +16 -3
- package/builders/joinBuilders/builders/abstractJoinBuilder.js +19 -2
- package/builders/joinBuilders/builders/selectWithFiveJoins.d.ts +16 -4
- package/builders/joinBuilders/builders/selectWithFiveJoins.js +19 -10
- package/builders/joinBuilders/builders/selectWithFourJoins.d.ts +31 -12
- package/builders/joinBuilders/builders/selectWithFourJoins.js +31 -21
- package/builders/joinBuilders/builders/selectWithJoin.d.ts +28 -12
- package/builders/joinBuilders/builders/selectWithJoin.js +23 -18
- package/builders/joinBuilders/builders/selectWithThreeJoins.d.ts +30 -12
- package/builders/joinBuilders/builders/selectWithThreeJoins.js +28 -20
- package/builders/joinBuilders/builders/selectWithTwoJoins.d.ts +29 -12
- package/builders/joinBuilders/builders/selectWithTwoJoins.js +25 -19
- package/builders/joinBuilders/responses/selectResponseFiveJoins.d.ts +14 -13
- package/builders/joinBuilders/responses/selectResponseFourJoins.d.ts +13 -12
- package/builders/joinBuilders/responses/selectResponseThreeJoins.d.ts +8 -7
- package/builders/joinBuilders/responses/selectResponseTwoJoins.d.ts +8 -7
- package/builders/joinBuilders/responses/selectResponseWithJoin.d.ts +8 -7
- package/builders/lowLvlBuilders/selects/select.d.ts +5 -1
- package/builders/lowLvlBuilders/selects/select.js +3 -2
- package/builders/lowLvlBuilders/selects/selectFrom.d.ts +9 -3
- package/builders/lowLvlBuilders/selects/selectJoined.d.ts +8 -2
- package/builders/lowLvlBuilders/selects/whereSelect.d.ts +1 -1
- package/builders/requestBuilders/updates/static.d.ts +2 -2
- package/builders/requestBuilders/where/static.d.ts +9 -9
- package/columns/column.d.ts +19 -15
- package/columns/column.js +8 -1
- package/docs/cases/simple_delete.js +1 -1
- package/docs/cases/simple_insert.js +9 -4
- package/docs/cases/simple_join.js +20 -6
- package/docs/cases/simple_select.js +15 -9
- package/docs/cases/simple_update.js +1 -1
- package/docs/tables/citiesTable.d.ts +5 -5
- package/docs/tables/citiesTable.js +1 -2
- package/docs/tables/userGroupsTable.d.ts +3 -3
- package/docs/tables/usersTable.d.ts +9 -10
- package/docs/tables/usersTable.js +2 -2
- package/docs/tables/usersToUserGroups.d.ts +2 -2
- package/mappers/responseMapper.d.ts +4 -1
- package/mappers/responseMapper.js +18 -6
- package/migrator/migrator.js +6 -5
- package/package.json +1 -1
- package/tables/abstractTable.d.ts +19 -20
- package/tables/abstractTable.js +3 -2
- package/tables/inferTypes.d.ts +14 -0
- package/tables/migrationsTable.d.ts +3 -3
- package/test.js +24 -17
package/README.md
CHANGED
|
@@ -151,7 +151,7 @@ const usersTable = new UsersTable(db);
|
|
|
151
151
|
const allSelect = await usersTable.select().all();
|
|
152
152
|
|
|
153
153
|
// select first
|
|
154
|
-
const firstSelect = await usersTable.select().
|
|
154
|
+
const firstSelect = await usersTable.select().findOne();
|
|
155
155
|
```
|
|
156
156
|
#### **Sorting and Filtering**
|
|
157
157
|
---
|
|
@@ -178,7 +178,7 @@ const orSelect = await usersTable.select().where(
|
|
|
178
178
|
```
|
|
179
179
|
##### Select all records from `Users` using **LIMIT** and **OFFSET**
|
|
180
180
|
```typescript
|
|
181
|
-
const limitOffsetSelect = await usersTable.select(
|
|
181
|
+
const limitOffsetSelect = await usersTable.select().limit(10).offset(10).all();
|
|
182
182
|
```
|
|
183
183
|
##### Select all records from `Users` where `phone` contains `"hello"`
|
|
184
184
|
```typescript
|
|
@@ -232,6 +232,17 @@ const notEqSelect = usersTable.select().where(
|
|
|
232
232
|
```typescript
|
|
233
233
|
const ordered = await usersTable.select().orderBy((table) => table.phone, Order.ASC).all();
|
|
234
234
|
```
|
|
235
|
+
#### **Partial Selecting**
|
|
236
|
+
```typescript
|
|
237
|
+
const partialSelect = await usersTable.select({
|
|
238
|
+
id: usersTable.id,
|
|
239
|
+
phone: usersTable.phone,
|
|
240
|
+
}).all();
|
|
241
|
+
|
|
242
|
+
// Usage
|
|
243
|
+
const { mappedId, mappedPhone } = partialSelect;
|
|
244
|
+
```
|
|
245
|
+
|
|
235
246
|
|
|
236
247
|
### **Update**
|
|
237
248
|
---
|
|
@@ -254,7 +265,7 @@ await usersTable.update()
|
|
|
254
265
|
await usersTable.update()
|
|
255
266
|
.where(eq(usersTable.phone, 'hello'))
|
|
256
267
|
.set({ fullName: 'newName' })
|
|
257
|
-
.
|
|
268
|
+
.findOne();
|
|
258
269
|
```
|
|
259
270
|
|
|
260
271
|
### **Delete**
|
|
@@ -274,7 +285,7 @@ await usersTable.delete()
|
|
|
274
285
|
```typescript
|
|
275
286
|
await usersTable.delete()
|
|
276
287
|
.where(eq(usersTable.phone, 'hello'))
|
|
277
|
-
.
|
|
288
|
+
.findOne();
|
|
278
289
|
```
|
|
279
290
|
|
|
280
291
|
### **Insert**
|
|
@@ -297,7 +308,7 @@ const user = await usersTable.insert({
|
|
|
297
308
|
const user = await usersTable.insert({
|
|
298
309
|
test: 1,
|
|
299
310
|
createdAt: new Date(),
|
|
300
|
-
}).
|
|
311
|
+
}).findOne();
|
|
301
312
|
```
|
|
302
313
|
##### Insert many `users` with required fields and get all inserted entities
|
|
303
314
|
```typescript
|
|
@@ -349,7 +360,7 @@ const citiesWithUserObject = userWithCities.map((city, user) => ({ ...city, user
|
|
|
349
360
|
.leftJoin(UsersTable,
|
|
350
361
|
(userToGroup) => userToGroup.userId,
|
|
351
362
|
(users) => users.id)
|
|
352
|
-
.leftJoin(UserGroupsTable,
|
|
363
|
+
.leftJoin(UsersToUserGroupsTable, UserGroupsTable,
|
|
353
364
|
(userToGroup) => userToGroup.groupId,
|
|
354
365
|
(users) => users.id)
|
|
355
366
|
.execute();
|
|
@@ -371,7 +382,7 @@ const citiesWithUserObject = userWithCities.map((city, user) => ({ ...city, user
|
|
|
371
382
|
.leftJoin(UsersTable,
|
|
372
383
|
(userToGroup) => userToGroup.userId,
|
|
373
384
|
(users) => users.id)
|
|
374
|
-
.leftJoin(UserGroupsTable,
|
|
385
|
+
.leftJoin(UsersToUserGroupsTable, UserGroupsTable,
|
|
375
386
|
(userToGroup) => userToGroup.groupId,
|
|
376
387
|
(users) => users.id)
|
|
377
388
|
.execute();
|
|
@@ -386,14 +397,33 @@ const citiesWithUserObject = userWithCities.map((city, user) => ({ ...city, user
|
|
|
386
397
|
users: userGroupWithUsers.many,
|
|
387
398
|
};
|
|
388
399
|
```
|
|
400
|
+
### Join using partial field select
|
|
401
|
+
##### Join Cities with Users getting only needed fields form request
|
|
402
|
+
```typescript
|
|
403
|
+
await citiesTable.select({
|
|
404
|
+
id: citiesTable.id,
|
|
405
|
+
userId: citiesTable.userId,
|
|
406
|
+
})
|
|
407
|
+
.where(eq(citiesTable.id, 1))
|
|
408
|
+
.leftJoin(UsersTable,
|
|
409
|
+
(city) => city.userId,
|
|
410
|
+
(users) => users.id,
|
|
411
|
+
{
|
|
412
|
+
id: usersTable.id,
|
|
413
|
+
})
|
|
414
|
+
.execute();
|
|
415
|
+
|
|
416
|
+
const citiesWithUserObject = userWithCities.map((city, user) => ({ ...city, user }));
|
|
417
|
+
```
|
|
418
|
+
|
|
389
419
|
|
|
390
420
|
## Migrations
|
|
391
|
-
#### To run migrations generated by drizzle-kit you could use `
|
|
421
|
+
#### To run migrations generated by drizzle-kit you could use `Migrator` class
|
|
392
422
|
##### Provide drizzle-kit config path
|
|
393
423
|
```typescript
|
|
394
424
|
await drizzle.migrator(db).migrate('src/drizzle.config.yaml');
|
|
395
425
|
```
|
|
396
|
-
#####
|
|
426
|
+
##### Another possibility is to provide object with path to folder with migrations
|
|
397
427
|
```typescript
|
|
398
428
|
await drizzle.migrator(db).migrate({ migrationFolder: 'drizzle' });
|
|
399
429
|
```
|
|
@@ -4,6 +4,8 @@ import { AbstractTable } from '../../tables';
|
|
|
4
4
|
export default class Aggregator {
|
|
5
5
|
protected _fields: Array<string>;
|
|
6
6
|
protected _table: AbstractTable<any>;
|
|
7
|
-
constructor(table: AbstractTable<any
|
|
8
|
-
|
|
7
|
+
constructor(table: AbstractTable<any>, partial?: {
|
|
8
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, AbstractTable<any>>;
|
|
9
|
+
});
|
|
10
|
+
protected generateSelectArray: (table: string, columns: AbstractColumn<ColumnType>[], id?: number | undefined) => string[];
|
|
9
11
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable max-len */
|
|
3
4
|
const column_1 = require("../../columns/column");
|
|
4
5
|
const ecranate_1 = require("../../utils/ecranate");
|
|
6
|
+
// eslint-disable-next-line max-len
|
|
5
7
|
class Aggregator {
|
|
6
|
-
constructor(table) {
|
|
8
|
+
constructor(table, partial) {
|
|
7
9
|
this._fields = [];
|
|
8
|
-
this.generateSelectArray = (table, columns) => {
|
|
10
|
+
this.generateSelectArray = (table, columns, id) => {
|
|
9
11
|
const selectFields = [];
|
|
10
12
|
columns.forEach((field) => {
|
|
11
13
|
if (field instanceof column_1.Column) {
|
|
@@ -14,7 +16,7 @@ class Aggregator {
|
|
|
14
16
|
selectFields.push('.');
|
|
15
17
|
selectFields.push(ecranate_1.ecranate(field.getColumnName()));
|
|
16
18
|
selectFields.push(' AS ');
|
|
17
|
-
selectFields.push(ecranate_1.ecranate(`${
|
|
19
|
+
selectFields.push(ecranate_1.ecranate(`${field.getAlias()}${id ? `_${id}` : ''}`));
|
|
18
20
|
selectFields.push(',');
|
|
19
21
|
}
|
|
20
22
|
});
|
|
@@ -22,7 +24,12 @@ class Aggregator {
|
|
|
22
24
|
return selectFields;
|
|
23
25
|
};
|
|
24
26
|
this._table = table;
|
|
25
|
-
|
|
27
|
+
if (!partial) {
|
|
28
|
+
this._fields = this.generateSelectArray(this._table.tableName(), Object.values(this._table.mapServiceToDb()));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this._fields = this.generateSelectArray(this._table.tableName(), Object.values(partial));
|
|
32
|
+
}
|
|
26
33
|
}
|
|
27
34
|
}
|
|
28
35
|
exports.default = Aggregator;
|
|
@@ -14,13 +14,21 @@ export default class SelectAggregator extends Aggregator {
|
|
|
14
14
|
private _offset;
|
|
15
15
|
private _distinct;
|
|
16
16
|
private _orderBy;
|
|
17
|
-
constructor(table: AbstractTable<any
|
|
17
|
+
constructor(table: AbstractTable<any>, partial?: {
|
|
18
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, AbstractTable<any>>;
|
|
19
|
+
});
|
|
18
20
|
filters: (filters: Expr) => SelectAggregator;
|
|
19
21
|
limit: (limit?: number | undefined) => SelectAggregator;
|
|
20
22
|
offset: (offset?: number | undefined) => SelectAggregator;
|
|
21
|
-
orderBy: (column?: AbstractColumn<ColumnType<{}>, boolean, boolean> | undefined, order?: Order | undefined) => SelectAggregator;
|
|
22
|
-
distinct: (column?: AbstractColumn<ColumnType<{}>, boolean, boolean> | undefined) => SelectAggregator;
|
|
23
|
+
orderBy: (column?: AbstractColumn<ColumnType<{}>, boolean, boolean, any> | undefined, order?: Order | undefined) => SelectAggregator;
|
|
24
|
+
distinct: (column?: AbstractColumn<ColumnType<{}>, boolean, boolean, any> | undefined) => SelectAggregator;
|
|
23
25
|
appendFrom: (tableName: string) => SelectAggregator;
|
|
24
|
-
join: (joins:
|
|
26
|
+
join: (joins: {
|
|
27
|
+
join: Join<any>;
|
|
28
|
+
partial?: {
|
|
29
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, any>;
|
|
30
|
+
} | undefined;
|
|
31
|
+
id?: number | undefined;
|
|
32
|
+
}[]) => SelectAggregator;
|
|
25
33
|
buildQuery: () => string;
|
|
26
34
|
}
|
|
@@ -4,8 +4,10 @@ const ecranate_1 = require("../../utils/ecranate");
|
|
|
4
4
|
const order_1 = require("../highLvlBuilders/order");
|
|
5
5
|
const abstractAggregator_1 = require("./abstractAggregator");
|
|
6
6
|
class SelectAggregator extends abstractAggregator_1.default {
|
|
7
|
-
constructor(table)
|
|
8
|
-
|
|
7
|
+
// public constructor(table: AbstractTable<any>);
|
|
8
|
+
// public constructor(table: AbstractTable<any>, partial: {[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, AbstractTable<any>>})
|
|
9
|
+
constructor(table, partial) {
|
|
10
|
+
super(table, partial);
|
|
9
11
|
this._from = [];
|
|
10
12
|
this._filters = [];
|
|
11
13
|
this._select = ['SELECT'];
|
|
@@ -57,27 +59,42 @@ class SelectAggregator extends abstractAggregator_1.default {
|
|
|
57
59
|
};
|
|
58
60
|
// Add select generator for second table also
|
|
59
61
|
this.join = (joins) => {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
const
|
|
62
|
+
const cache = {};
|
|
63
|
+
joins.forEach((joinObject) => {
|
|
64
|
+
if (joinObject) {
|
|
65
|
+
const tableFrom = joinObject.join.fromColumn.getParentName();
|
|
66
|
+
const tableTo = joinObject.join.toColumn.getParentName();
|
|
67
|
+
const { type } = joinObject.join;
|
|
68
|
+
let selectString;
|
|
69
|
+
if (joinObject.partial) {
|
|
70
|
+
selectString = this.generateSelectArray(`${tableTo}${joinObject.id ? `_${joinObject.id}` : ''}`, Object.values(joinObject.partial), joinObject.id).join('');
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
selectString = this.generateSelectArray(`${tableTo}${joinObject.id ? `_${joinObject.id}` : ''}`, Object.values(joinObject.join.mappedServiceToDb), joinObject.id).join('');
|
|
74
|
+
}
|
|
66
75
|
this._fields.push(', ');
|
|
67
76
|
this._fields.push(selectString);
|
|
68
77
|
this._join.push('\n');
|
|
69
78
|
this._join.push(type);
|
|
70
79
|
this._join.push(' ');
|
|
71
80
|
this._join.push(tableTo);
|
|
81
|
+
this._join.push(' ');
|
|
82
|
+
this._join.push(`AS ${tableTo}${joinObject.id ? `_${joinObject.id}` : ''}`);
|
|
72
83
|
this._join.push('\n');
|
|
73
84
|
this._join.push('ON ');
|
|
74
|
-
|
|
85
|
+
if (cache[tableFrom]) {
|
|
86
|
+
this._join.push(cache[tableFrom]);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this._join.push(tableFrom);
|
|
90
|
+
cache[tableTo] = `${tableTo}${joinObject.id ? `_${joinObject.id}` : ''}`;
|
|
91
|
+
}
|
|
75
92
|
this._join.push('.');
|
|
76
|
-
this._join.push(join.fromColumn.getColumnName());
|
|
93
|
+
this._join.push(joinObject.join.fromColumn.getColumnName());
|
|
77
94
|
this._join.push(' = ');
|
|
78
|
-
this._join.push(tableTo);
|
|
95
|
+
this._join.push(`${tableTo}${joinObject.id ? `_${joinObject.id}` : ''}`);
|
|
79
96
|
this._join.push('.');
|
|
80
|
-
this._join.push(join.toColumn.getColumnName());
|
|
97
|
+
this._join.push(joinObject.join.toColumn.getColumnName());
|
|
81
98
|
}
|
|
82
99
|
});
|
|
83
100
|
return this;
|
|
@@ -4,7 +4,9 @@ import { ISession } from '../../db/session';
|
|
|
4
4
|
import BaseLogger from '../../logger/abstractLogger';
|
|
5
5
|
import { AbstractTable } from '../../tables';
|
|
6
6
|
import { ExtractModel } from '../../tables/inferTypes';
|
|
7
|
-
export default abstract class TableRequestBuilder<TTable extends AbstractTable<TTable
|
|
7
|
+
export default abstract class TableRequestBuilder<TTable extends AbstractTable<TTable>, TPartial extends {
|
|
8
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, TTable>;
|
|
9
|
+
} = {}> {
|
|
8
10
|
protected _table: TTable;
|
|
9
11
|
protected _session: ISession;
|
|
10
12
|
protected _mappedServiceToDb: {
|
|
@@ -15,7 +17,11 @@ export default abstract class TableRequestBuilder<TTable extends AbstractTable<T
|
|
|
15
17
|
constructor(table: AbstractTable<TTable>, session: ISession, mappedServiceToDb: {
|
|
16
18
|
[name in keyof ExtractModel<TTable>]: AbstractColumn<ColumnType>;
|
|
17
19
|
}, logger?: BaseLogger);
|
|
18
|
-
all: () => Promise<
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
all: () => Promise<([keyof TPartial] extends [never] ? ExtractModel<TTable> : ExtractModel<TPartial>)[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Current function will return an element only if response is of length 1
|
|
23
|
+
* If there are more or less than 1 element, will throw an Error
|
|
24
|
+
*/
|
|
25
|
+
findOne: () => Promise<[keyof TPartial] extends [never] ? ExtractModel<TTable> : ExtractModel<TPartial>>;
|
|
26
|
+
protected abstract _execute(): Promise<Array<[keyof TPartial] extends [never] ? ExtractModel<TTable> : ExtractModel<TPartial>>>;
|
|
21
27
|
}
|
|
@@ -6,10 +6,21 @@ class TableRequestBuilder {
|
|
|
6
6
|
const res = await this._execute();
|
|
7
7
|
return res;
|
|
8
8
|
};
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Current function will return an element only if response is of length 1
|
|
11
|
+
* If there are more or less than 1 element, will throw an Error
|
|
12
|
+
*/
|
|
13
|
+
this.findOne = async () => {
|
|
10
14
|
const executionRes = await this._execute();
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
if (executionRes.length > 1) {
|
|
16
|
+
throw new Error('Request contains more than 1 element');
|
|
17
|
+
}
|
|
18
|
+
else if (executionRes.length < 1) {
|
|
19
|
+
throw new Error('Request contains less than 1 element ');
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return executionRes[0];
|
|
23
|
+
}
|
|
13
24
|
};
|
|
14
25
|
this._mappedServiceToDb = mappedServiceToDb;
|
|
15
26
|
this._table = table;
|
|
@@ -6,12 +6,14 @@ import { AbstractTable } from '../../tables';
|
|
|
6
6
|
import { ExtractModel } from '../../tables/inferTypes';
|
|
7
7
|
import Expr from '../requestBuilders/where/where';
|
|
8
8
|
import TableRequestBuilder from './abstractRequestBuilder';
|
|
9
|
-
export default class DeleteTRB<TTable extends AbstractTable<TTable
|
|
9
|
+
export default class DeleteTRB<TTable extends AbstractTable<TTable>, TPartial extends {
|
|
10
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, TTable>;
|
|
11
|
+
} = {}> extends TableRequestBuilder<TTable, TPartial> {
|
|
10
12
|
private _filter;
|
|
11
13
|
constructor(table: AbstractTable<TTable>, session: ISession, mappedServiceToDb: {
|
|
12
14
|
[name in keyof ExtractModel<TTable>]: AbstractColumn<ColumnType>;
|
|
13
15
|
}, logger?: BaseLogger);
|
|
14
16
|
where: (expr: Expr) => DeleteTRB<TTable>;
|
|
15
17
|
execute: () => Promise<void>;
|
|
16
|
-
protected _execute: () => Promise<Array<ExtractModel<TTable>
|
|
18
|
+
protected _execute: () => Promise<Array<[keyof TPartial] extends [never] ? ExtractModel<TTable> : ExtractModel<TPartial>>>;
|
|
17
19
|
}
|
|
@@ -5,7 +5,9 @@ import BaseLogger from '../../logger/abstractLogger';
|
|
|
5
5
|
import { AbstractTable } from '../../tables';
|
|
6
6
|
import { ExtractModel, Indexing } from '../../tables/inferTypes';
|
|
7
7
|
import TableRequestBuilder from './abstractRequestBuilder';
|
|
8
|
-
export default class InsertTRB<TTable extends AbstractTable<TTable
|
|
8
|
+
export default class InsertTRB<TTable extends AbstractTable<TTable>, TPartial extends {
|
|
9
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, TTable>;
|
|
10
|
+
} = {}> extends TableRequestBuilder<TTable, TPartial> {
|
|
9
11
|
private _values;
|
|
10
12
|
private _onConflict;
|
|
11
13
|
private _onConflictField;
|
|
@@ -14,5 +16,5 @@ export default class InsertTRB<TTable extends AbstractTable<TTable>> extends Tab
|
|
|
14
16
|
}, table: AbstractTable<TTable>, logger?: BaseLogger);
|
|
15
17
|
execute: () => Promise<void>;
|
|
16
18
|
onConflict: (callback: (table: TTable) => Indexing, update: Partial<ExtractModel<TTable>>) => InsertTRB<TTable>;
|
|
17
|
-
protected _execute: () => Promise<Array<ExtractModel<TTable>
|
|
19
|
+
protected _execute: () => Promise<Array<[keyof TPartial] extends [never] ? ExtractModel<TTable> : ExtractModel<TPartial>>>;
|
|
18
20
|
}
|
|
@@ -4,39 +4,44 @@ import DB from '../../db/db';
|
|
|
4
4
|
import { ISession } from '../../db/session';
|
|
5
5
|
import BaseLogger from '../../logger/abstractLogger';
|
|
6
6
|
import { AbstractTable } from '../../tables';
|
|
7
|
-
import { ExtractModel } from '../../tables/inferTypes';
|
|
7
|
+
import { ExtractModel, PartialFor } from '../../tables/inferTypes';
|
|
8
8
|
import SelectTRBWithJoin from '../joinBuilders/builders/selectWithJoin';
|
|
9
9
|
import Expr from '../requestBuilders/where/where';
|
|
10
10
|
import TableRequestBuilder from './abstractRequestBuilder';
|
|
11
11
|
import Order from './order';
|
|
12
|
-
export default class SelectTRB<TTable extends AbstractTable<TTable
|
|
12
|
+
export default class SelectTRB<TTable extends AbstractTable<TTable>, TPartial extends {
|
|
13
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, TTable>;
|
|
14
|
+
} = {}> extends TableRequestBuilder<TTable, TPartial> {
|
|
13
15
|
protected _filter: Expr;
|
|
14
16
|
private props;
|
|
15
17
|
private __orderBy?;
|
|
16
18
|
private __groupBy?;
|
|
17
19
|
private __order?;
|
|
18
20
|
private __distinct;
|
|
21
|
+
private __partial?;
|
|
19
22
|
constructor(session: ISession, mappedServiceToDb: {
|
|
20
23
|
[name in keyof ExtractModel<TTable>]: AbstractColumn<ColumnType>;
|
|
21
24
|
}, props: {
|
|
22
25
|
limit?: number;
|
|
23
26
|
offset?: number;
|
|
24
|
-
}, table: AbstractTable<TTable>, logger?: BaseLogger);
|
|
25
|
-
where: (expr: Expr) => SelectTRB<TTable>;
|
|
26
|
-
orderBy<TColumnType extends ColumnType>(callback: (table: TTable) => AbstractColumn<TColumnType, boolean, boolean>, order: Order): SelectTRB<TTable>;
|
|
27
|
-
distinct: (column: AbstractColumn<ColumnType<any>, boolean, boolean>) => SelectTRB<TTable>;
|
|
28
|
-
|
|
27
|
+
}, table: AbstractTable<TTable>, logger?: BaseLogger, partial?: TPartial);
|
|
28
|
+
where: (expr: Expr) => SelectTRB<TTable, TPartial>;
|
|
29
|
+
orderBy<TColumnType extends ColumnType>(callback: (table: TTable) => AbstractColumn<TColumnType, boolean, boolean>, order: Order): SelectTRB<TTable, TPartial>;
|
|
30
|
+
distinct: (column: AbstractColumn<ColumnType<any>, boolean, boolean>) => SelectTRB<TTable, TPartial>;
|
|
31
|
+
limit: (limit: number) => SelectTRB<TTable, TPartial>;
|
|
32
|
+
offset: (offset: number) => SelectTRB<TTable, TPartial>;
|
|
33
|
+
innerJoin<TColumn extends ColumnType, IToTable extends AbstractTable<IToTable>, IToPartial extends PartialFor<IToTable> = {}>(table: {
|
|
29
34
|
new (db: DB): IToTable;
|
|
30
|
-
}, from: (table: TTable) => AbstractColumn<TColumn, boolean, boolean>, to: (table: IToTable) => AbstractColumn<TColumn, boolean, boolean
|
|
31
|
-
leftJoin<TColumn extends ColumnType
|
|
35
|
+
}, from: (table: TTable) => AbstractColumn<TColumn, boolean, boolean>, to: (table: IToTable) => AbstractColumn<TColumn, boolean, boolean>, partial?: IToPartial): SelectTRBWithJoin<TTable, IToTable, TPartial, IToPartial>;
|
|
36
|
+
leftJoin<TColumn extends ColumnType<any>, IToColumn extends ColumnType<any>, IToTable extends AbstractTable<IToTable>, IToPartial extends PartialFor<IToTable> = {}>(table: {
|
|
32
37
|
new (db: DB): IToTable;
|
|
33
|
-
}, from: (table: TTable) => AbstractColumn<TColumn, boolean, boolean>, to: (table: IToTable) => AbstractColumn<
|
|
34
|
-
rightJoin<TColumn extends ColumnType, IToTable extends AbstractTable<IToTable
|
|
38
|
+
}, from: (table: TTable) => AbstractColumn<TColumn, boolean, boolean, TTable>, to: (table: IToTable) => AbstractColumn<IToColumn, boolean, boolean, IToTable>, partial?: IToPartial): SelectTRBWithJoin<TTable, IToTable, TPartial, IToPartial>;
|
|
39
|
+
rightJoin<TColumn extends ColumnType, IToTable extends AbstractTable<IToTable>, IToPartial extends PartialFor<IToTable> = {}>(table: {
|
|
35
40
|
new (db: DB): IToTable;
|
|
36
|
-
}, from: (table: TTable) => AbstractColumn<TColumn, boolean, boolean>, to: (table: IToTable) => AbstractColumn<TColumn, boolean, boolean
|
|
37
|
-
fullJoin<TColumn extends ColumnType, IToTable extends AbstractTable<IToTable
|
|
41
|
+
}, from: (table: TTable) => AbstractColumn<TColumn, boolean, boolean>, to: (table: IToTable) => AbstractColumn<TColumn, boolean, boolean>, partial?: IToPartial): SelectTRBWithJoin<TTable, IToTable, TPartial, IToPartial>;
|
|
42
|
+
fullJoin<TColumn extends ColumnType, IToTable extends AbstractTable<IToTable>, IToPartial extends PartialFor<IToTable> = {}>(table: {
|
|
38
43
|
new (db: DB): IToTable;
|
|
39
|
-
}, from: (table: TTable) => AbstractColumn<TColumn, boolean, boolean>, to: (table: IToTable) => AbstractColumn<TColumn, boolean, boolean
|
|
40
|
-
execute: () => Promise<(ExtractModel<TTable>
|
|
41
|
-
protected _execute: () => Promise<Array<ExtractModel<TTable>
|
|
44
|
+
}, from: (table: TTable) => AbstractColumn<TColumn, boolean, boolean>, to: (table: IToTable) => AbstractColumn<TColumn, boolean, boolean>, partial?: IToPartial): SelectTRBWithJoin<TTable, IToTable, TPartial, IToPartial>;
|
|
45
|
+
execute: () => Promise<([keyof TPartial] extends [never] ? ExtractModel<TTable> : ExtractModel<TPartial>)[]>;
|
|
46
|
+
protected _execute: () => Promise<Array<[keyof TPartial] extends [never] ? ExtractModel<TTable> : ExtractModel<TPartial>>>;
|
|
42
47
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
/* eslint-disable import/no-cycle */
|
|
4
3
|
const __1 = require("..");
|
|
5
4
|
const builderError_1 = require("../../errors/builderError");
|
|
6
5
|
const responseMapper_1 = require("../../mappers/responseMapper");
|
|
@@ -8,7 +7,7 @@ const selectWithJoin_1 = require("../joinBuilders/builders/selectWithJoin");
|
|
|
8
7
|
const join_1 = require("../joinBuilders/join");
|
|
9
8
|
const abstractRequestBuilder_1 = require("./abstractRequestBuilder");
|
|
10
9
|
class SelectTRB extends abstractRequestBuilder_1.default {
|
|
11
|
-
constructor(session, mappedServiceToDb, props, table, logger) {
|
|
10
|
+
constructor(session, mappedServiceToDb, props, table, logger, partial) {
|
|
12
11
|
super(table, session, mappedServiceToDb, logger);
|
|
13
12
|
this.where = (expr) => {
|
|
14
13
|
this._filter = expr;
|
|
@@ -18,6 +17,14 @@ class SelectTRB extends abstractRequestBuilder_1.default {
|
|
|
18
17
|
this.__distinct = column;
|
|
19
18
|
return this;
|
|
20
19
|
};
|
|
20
|
+
this.limit = (limit) => {
|
|
21
|
+
this.props.limit = limit;
|
|
22
|
+
return this;
|
|
23
|
+
};
|
|
24
|
+
this.offset = (offset) => {
|
|
25
|
+
this.props.offset = offset;
|
|
26
|
+
return this;
|
|
27
|
+
};
|
|
21
28
|
this.execute = async () => {
|
|
22
29
|
const res = await this._execute();
|
|
23
30
|
return res;
|
|
@@ -25,7 +32,7 @@ class SelectTRB extends abstractRequestBuilder_1.default {
|
|
|
25
32
|
this._execute = async () => {
|
|
26
33
|
// Select.from().filteredBy().limit().offset().orderBy().groupBy().build()
|
|
27
34
|
const queryBuilder = __1.Select
|
|
28
|
-
.from(this._table)
|
|
35
|
+
.from(this._table, this.__partial)
|
|
29
36
|
.distinct(this.__distinct)
|
|
30
37
|
.filteredBy(this._filter)
|
|
31
38
|
.limit(this.props.limit)
|
|
@@ -42,9 +49,13 @@ class SelectTRB extends abstractRequestBuilder_1.default {
|
|
|
42
49
|
this._logger.info(`Selecting from ${this._table.tableName()} using query:\n ${query}`);
|
|
43
50
|
}
|
|
44
51
|
const result = await this._session.execute(query);
|
|
52
|
+
if (this.__partial) {
|
|
53
|
+
return responseMapper_1.default.partialMap(this.__partial, result);
|
|
54
|
+
}
|
|
45
55
|
return responseMapper_1.default.map(this._mappedServiceToDb, result);
|
|
46
56
|
};
|
|
47
57
|
this.props = props;
|
|
58
|
+
this.__partial = partial;
|
|
48
59
|
}
|
|
49
60
|
orderBy(callback, order) {
|
|
50
61
|
this.__orderBy = callback(this._table);
|
|
@@ -56,37 +67,37 @@ class SelectTRB extends abstractRequestBuilder_1.default {
|
|
|
56
67
|
// this.__groupBy = callback(this.__table);
|
|
57
68
|
// return this;
|
|
58
69
|
// }
|
|
59
|
-
innerJoin(table, from, to) {
|
|
70
|
+
innerJoin(table, from, to, partial) {
|
|
60
71
|
const toTable = this._table.db.create(table);
|
|
61
72
|
const fromColumn = from(this._table);
|
|
62
73
|
const toColumn = to(toTable);
|
|
63
74
|
const join = new __1.JoinWith(toTable.tableName(), toTable.mapServiceToDb())
|
|
64
75
|
.columns(fromColumn, toColumn).joinStrategy(join_1.JoinStrategy.INNER_JOIN);
|
|
65
|
-
return new selectWithJoin_1.default(this._table, this._session, this._filter, join, this.props, this.__orderBy, this.__order, this.__distinct);
|
|
76
|
+
return new selectWithJoin_1.default(this._table, this._session, this._filter, join, this.props, this.__orderBy, this.__order, this.__distinct, this.__partial, partial);
|
|
66
77
|
}
|
|
67
|
-
leftJoin(table, from, to) {
|
|
78
|
+
leftJoin(table, from, to, partial) {
|
|
68
79
|
const toTable = this._table.db.create(table);
|
|
69
80
|
const fromColumn = from(this._table);
|
|
70
81
|
const toColumn = to(toTable);
|
|
71
82
|
const join = new __1.JoinWith(toTable.tableName(), toTable.mapServiceToDb())
|
|
72
83
|
.columns(fromColumn, toColumn).joinStrategy(join_1.JoinStrategy.LEFT_JOIN);
|
|
73
|
-
return new selectWithJoin_1.default(this._table, this._session, this._filter, join, this.props, this.__orderBy, this.__order, this.__distinct);
|
|
84
|
+
return new selectWithJoin_1.default(this._table, this._session, this._filter, join, this.props, this.__orderBy, this.__order, this.__distinct, this.__partial, partial);
|
|
74
85
|
}
|
|
75
|
-
rightJoin(table, from, to) {
|
|
86
|
+
rightJoin(table, from, to, partial) {
|
|
76
87
|
const toTable = this._table.db.create(table);
|
|
77
88
|
const fromColumn = from(this._table);
|
|
78
89
|
const toColumn = to(toTable);
|
|
79
90
|
const join = new __1.JoinWith(toTable.tableName(), toTable.mapServiceToDb())
|
|
80
91
|
.columns(fromColumn, toColumn).joinStrategy(join_1.JoinStrategy.RIGHT_JOIN);
|
|
81
|
-
return new selectWithJoin_1.default(this._table, this._session, this._filter, join, this.props, this.__orderBy, this.__order, this.__distinct);
|
|
92
|
+
return new selectWithJoin_1.default(this._table, this._session, this._filter, join, this.props, this.__orderBy, this.__order, this.__distinct, this.__partial, partial);
|
|
82
93
|
}
|
|
83
|
-
fullJoin(table, from, to) {
|
|
94
|
+
fullJoin(table, from, to, partial) {
|
|
84
95
|
const toTable = this._table.db.create(table);
|
|
85
96
|
const fromColumn = from(this._table);
|
|
86
97
|
const toColumn = to(toTable);
|
|
87
98
|
const join = new __1.JoinWith(toTable.tableName(), toTable.mapServiceToDb())
|
|
88
99
|
.columns(fromColumn, toColumn).joinStrategy(join_1.JoinStrategy.FULL_JOIN);
|
|
89
|
-
return new selectWithJoin_1.default(this._table, this._session, this._filter, join, this.props, this.__orderBy, this.__order, this.__distinct);
|
|
100
|
+
return new selectWithJoin_1.default(this._table, this._session, this._filter, join, this.props, this.__orderBy, this.__order, this.__distinct, this.__partial, partial);
|
|
90
101
|
}
|
|
91
102
|
}
|
|
92
103
|
exports.default = SelectTRB;
|
|
@@ -6,7 +6,9 @@ import { AbstractTable } from '../../tables';
|
|
|
6
6
|
import { ExtractModel, ExtractUpdateModel } from '../../tables/inferTypes';
|
|
7
7
|
import Expr from '../requestBuilders/where/where';
|
|
8
8
|
import TableRequestBuilder from './abstractRequestBuilder';
|
|
9
|
-
export default class UpdateTRB<TTable extends AbstractTable<TTable
|
|
9
|
+
export default class UpdateTRB<TTable extends AbstractTable<TTable>, TPartial extends {
|
|
10
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, TTable>;
|
|
11
|
+
} = {}> extends TableRequestBuilder<TTable, TPartial> {
|
|
10
12
|
private _filter;
|
|
11
13
|
private _update;
|
|
12
14
|
private _objToUpdate;
|
|
@@ -16,5 +18,5 @@ export default class UpdateTRB<TTable extends AbstractTable<TTable>> extends Tab
|
|
|
16
18
|
where: (expr: Expr) => UpdateTRB<TTable>;
|
|
17
19
|
set: (expr: Partial<ExtractUpdateModel<TTable>>) => UpdateTRB<TTable>;
|
|
18
20
|
execute: () => Promise<void>;
|
|
19
|
-
protected _execute: () => Promise<Array<ExtractModel<TTable>
|
|
21
|
+
protected _execute: () => Promise<Array<[keyof TPartial] extends [never] ? ExtractModel<TTable> : ExtractModel<TPartial>>>;
|
|
20
22
|
}
|
|
@@ -3,10 +3,11 @@ import { AbstractColumn } from '../../../columns/column';
|
|
|
3
3
|
import ColumnType from '../../../columns/types/columnType';
|
|
4
4
|
import { ISession } from '../../../db/session';
|
|
5
5
|
import { AbstractTable } from '../../../tables';
|
|
6
|
+
import { ExtractModel, FullOrPartial, PartialFor } from '../../../tables/inferTypes';
|
|
6
7
|
import Order from '../../highLvlBuilders/order';
|
|
7
8
|
import Expr from '../../requestBuilders/where/where';
|
|
8
9
|
import Join from '../join';
|
|
9
|
-
export default abstract class AbstractJoined<TTable extends AbstractTable<TTable>, TRes> {
|
|
10
|
+
export default abstract class AbstractJoined<TTable extends AbstractTable<TTable>, TRes, TPartial extends PartialFor<TTable> = {}> {
|
|
10
11
|
protected _table: TTable;
|
|
11
12
|
protected _session: ISession;
|
|
12
13
|
protected _filter: Expr;
|
|
@@ -17,11 +18,23 @@ export default abstract class AbstractJoined<TTable extends AbstractTable<TTable
|
|
|
17
18
|
};
|
|
18
19
|
protected _orderBy?: AbstractColumn<ColumnType, boolean, boolean>;
|
|
19
20
|
protected _order?: Order;
|
|
21
|
+
protected _partial?: TPartial;
|
|
20
22
|
constructor(table: TTable, filter: Expr, session: ISession, props: {
|
|
21
23
|
limit?: number;
|
|
22
24
|
offset?: number;
|
|
23
|
-
}, orderBy?: AbstractColumn<ColumnType, boolean, boolean>, order?: Order, distinct?: AbstractColumn<ColumnType, boolean, boolean
|
|
25
|
+
}, orderBy?: AbstractColumn<ColumnType, boolean, boolean>, order?: Order, distinct?: AbstractColumn<ColumnType, boolean, boolean>, tablePartial?: TPartial);
|
|
26
|
+
limit: (limit: number) => this;
|
|
27
|
+
offset: (offset: number) => this;
|
|
24
28
|
execute: () => Promise<TRes>;
|
|
29
|
+
protected fullOrPartial<Table extends AbstractTable<Table>, Partial extends PartialFor<Table>>(mappedServiceToDb: {
|
|
30
|
+
[name in keyof ExtractModel<Table>]: AbstractColumn<ColumnType>;
|
|
31
|
+
}, result: QueryResult<any>, partial?: Partial, joinId?: number): Array<FullOrPartial<Table, Partial>>;
|
|
25
32
|
protected abstract mapResponse(result: QueryResult<any>): TRes;
|
|
26
|
-
protected abstract joins(): Array<
|
|
33
|
+
protected abstract joins(): Array<{
|
|
34
|
+
join: Join<any>;
|
|
35
|
+
partial?: {
|
|
36
|
+
[name: string]: AbstractColumn<ColumnType<any>, boolean, boolean, any>;
|
|
37
|
+
};
|
|
38
|
+
id?: number;
|
|
39
|
+
}>;
|
|
27
40
|
}
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const builderError_1 = require("../../../errors/builderError");
|
|
4
|
+
const responseMapper_1 = require("../../../mappers/responseMapper");
|
|
4
5
|
const select_1 = require("../../lowLvlBuilders/selects/select");
|
|
5
6
|
class AbstractJoined {
|
|
6
|
-
constructor(table, filter, session, props, orderBy, order, distinct) {
|
|
7
|
+
constructor(table, filter, session, props, orderBy, order, distinct, tablePartial) {
|
|
8
|
+
this.limit = (limit) => {
|
|
9
|
+
this._props.limit = limit;
|
|
10
|
+
return this;
|
|
11
|
+
};
|
|
12
|
+
this.offset = (offset) => {
|
|
13
|
+
this._props.offset = offset;
|
|
14
|
+
return this;
|
|
15
|
+
};
|
|
7
16
|
this.execute = async () => {
|
|
8
17
|
const queryBuilder = select_1.default
|
|
9
|
-
.from(this._table)
|
|
18
|
+
.from(this._table, this._partial)
|
|
10
19
|
.distinct(this._distinct)
|
|
11
20
|
.joined(this.joins())
|
|
12
21
|
.limit(this._props.limit)
|
|
@@ -16,6 +25,7 @@ class AbstractJoined {
|
|
|
16
25
|
let query = '';
|
|
17
26
|
try {
|
|
18
27
|
query = queryBuilder.build();
|
|
28
|
+
console.log(query);
|
|
19
29
|
}
|
|
20
30
|
catch (e) {
|
|
21
31
|
throw new builderError_1.default(builderError_1.BuilderType.JOINED_SELECT, this._table.tableName(), Object.values(this._table.mapServiceToDb()), e, this._filter);
|
|
@@ -30,6 +40,13 @@ class AbstractJoined {
|
|
|
30
40
|
this._order = order;
|
|
31
41
|
this._orderBy = orderBy;
|
|
32
42
|
this._distinct = distinct;
|
|
43
|
+
this._partial = tablePartial;
|
|
44
|
+
}
|
|
45
|
+
fullOrPartial(mappedServiceToDb, result, partial, joinId) {
|
|
46
|
+
if (partial) {
|
|
47
|
+
return responseMapper_1.default.partialMap(partial, result, joinId);
|
|
48
|
+
}
|
|
49
|
+
return responseMapper_1.default.map(mappedServiceToDb, result, joinId);
|
|
33
50
|
}
|
|
34
51
|
}
|
|
35
52
|
exports.default = AbstractJoined;
|