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.
Files changed (59) hide show
  1. package/README.md +39 -9
  2. package/builders/aggregators/abstractAggregator.d.ts +4 -2
  3. package/builders/aggregators/abstractAggregator.js +11 -4
  4. package/builders/aggregators/selectAggregator.d.ts +12 -4
  5. package/builders/aggregators/selectAggregator.js +29 -12
  6. package/builders/highLvlBuilders/abstractRequestBuilder.d.ts +10 -4
  7. package/builders/highLvlBuilders/abstractRequestBuilder.js +14 -3
  8. package/builders/highLvlBuilders/deleteRequestBuilder.d.ts +4 -2
  9. package/builders/highLvlBuilders/insertRequestBuilder.d.ts +4 -2
  10. package/builders/highLvlBuilders/insertRequestBuilder.js +1 -0
  11. package/builders/highLvlBuilders/selectRequestBuilder.d.ts +21 -16
  12. package/builders/highLvlBuilders/selectRequestBuilder.js +22 -11
  13. package/builders/highLvlBuilders/updateRequestBuilder.d.ts +4 -2
  14. package/builders/joinBuilders/builders/abstractJoinBuilder.d.ts +16 -3
  15. package/builders/joinBuilders/builders/abstractJoinBuilder.js +19 -2
  16. package/builders/joinBuilders/builders/selectWithFiveJoins.d.ts +16 -4
  17. package/builders/joinBuilders/builders/selectWithFiveJoins.js +19 -10
  18. package/builders/joinBuilders/builders/selectWithFourJoins.d.ts +31 -12
  19. package/builders/joinBuilders/builders/selectWithFourJoins.js +31 -21
  20. package/builders/joinBuilders/builders/selectWithJoin.d.ts +28 -12
  21. package/builders/joinBuilders/builders/selectWithJoin.js +23 -18
  22. package/builders/joinBuilders/builders/selectWithThreeJoins.d.ts +30 -12
  23. package/builders/joinBuilders/builders/selectWithThreeJoins.js +28 -20
  24. package/builders/joinBuilders/builders/selectWithTwoJoins.d.ts +29 -12
  25. package/builders/joinBuilders/builders/selectWithTwoJoins.js +25 -19
  26. package/builders/joinBuilders/responses/selectResponseFiveJoins.d.ts +14 -13
  27. package/builders/joinBuilders/responses/selectResponseFourJoins.d.ts +13 -12
  28. package/builders/joinBuilders/responses/selectResponseThreeJoins.d.ts +8 -7
  29. package/builders/joinBuilders/responses/selectResponseTwoJoins.d.ts +8 -7
  30. package/builders/joinBuilders/responses/selectResponseWithJoin.d.ts +8 -7
  31. package/builders/lowLvlBuilders/selects/select.d.ts +5 -1
  32. package/builders/lowLvlBuilders/selects/select.js +3 -2
  33. package/builders/lowLvlBuilders/selects/selectFrom.d.ts +9 -3
  34. package/builders/lowLvlBuilders/selects/selectJoined.d.ts +8 -2
  35. package/builders/lowLvlBuilders/selects/whereSelect.d.ts +1 -1
  36. package/builders/requestBuilders/updates/static.d.ts +2 -2
  37. package/builders/requestBuilders/where/static.d.ts +9 -9
  38. package/columns/column.d.ts +19 -15
  39. package/columns/column.js +8 -1
  40. package/docs/cases/simple_delete.js +1 -1
  41. package/docs/cases/simple_insert.js +9 -4
  42. package/docs/cases/simple_join.js +20 -6
  43. package/docs/cases/simple_select.js +15 -9
  44. package/docs/cases/simple_update.js +1 -1
  45. package/docs/tables/citiesTable.d.ts +5 -5
  46. package/docs/tables/citiesTable.js +1 -2
  47. package/docs/tables/userGroupsTable.d.ts +3 -3
  48. package/docs/tables/usersTable.d.ts +9 -10
  49. package/docs/tables/usersTable.js +2 -2
  50. package/docs/tables/usersToUserGroups.d.ts +2 -2
  51. package/mappers/responseMapper.d.ts +4 -1
  52. package/mappers/responseMapper.js +18 -6
  53. package/migrator/migrator.js +6 -5
  54. package/package.json +1 -1
  55. package/tables/abstractTable.d.ts +19 -20
  56. package/tables/abstractTable.js +3 -2
  57. package/tables/inferTypes.d.ts +14 -0
  58. package/tables/migrationsTable.d.ts +3 -3
  59. 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().first();
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({ limit: 10, offset: 10 }).all();
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
- .first();
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
- .first();
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
- }).first();
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 `Migtator` class
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
- ##### Provide object with path to folder with migrations
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
- protected generateSelectArray: (table: string, columns: AbstractColumn<ColumnType>[]) => string[];
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(`${table.replace('.', '_')}_${field.getColumnName()}`));
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
- this._fields = this.generateSelectArray(this._table.tableName(), Object.values(this._table.mapServiceToDb()));
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: Array<Join<any> | undefined>) => SelectAggregator;
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
- super(table);
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
- joins.forEach((join) => {
61
- if (join) {
62
- const tableFrom = join.fromColumn.getParentName();
63
- const tableTo = join.toColumn.getParentName();
64
- const { type } = join;
65
- const selectString = this.generateSelectArray(tableTo, Object.values(join.mappedServiceToDb)).join('');
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
- this._join.push(tableFrom);
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<Array<ExtractModel<TTable> | undefined>>;
19
- first: () => Promise<ExtractModel<TTable> | undefined>;
20
- protected abstract _execute(): Promise<Array<ExtractModel<TTable> | undefined>>;
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
- this.first = async () => {
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
- // TODO add checks for undefined or null
12
- return executionRes[0];
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>> extends TableRequestBuilder<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> | undefined>>;
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>> extends TableRequestBuilder<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> | undefined>>;
19
+ protected _execute: () => Promise<Array<[keyof TPartial] extends [never] ? ExtractModel<TTable> : ExtractModel<TPartial>>>;
18
20
  }
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable max-len */
3
4
  const __1 = require("..");
4
5
  const builderError_1 = require("../../errors/builderError");
5
6
  const responseMapper_1 = require("../../mappers/responseMapper");
@@ -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>> extends TableRequestBuilder<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
- innerJoin<TColumn extends ColumnType, IToTable extends AbstractTable<IToTable>>(table: {
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>): SelectTRBWithJoin<TTable, IToTable>;
31
- leftJoin<TColumn extends ColumnType, IToTable extends AbstractTable<IToTable>>(table: {
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<TColumn, boolean, boolean>): SelectTRBWithJoin<TTable, IToTable>;
34
- rightJoin<TColumn extends ColumnType, IToTable extends AbstractTable<IToTable>>(table: {
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>): SelectTRBWithJoin<TTable, IToTable>;
37
- fullJoin<TColumn extends ColumnType, IToTable extends AbstractTable<IToTable>>(table: {
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>): SelectTRBWithJoin<TTable, IToTable>;
40
- execute: () => Promise<(ExtractModel<TTable> | undefined)[]>;
41
- protected _execute: () => Promise<Array<ExtractModel<TTable> | undefined>>;
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>> extends TableRequestBuilder<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> | undefined>>;
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<Join<any>>;
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;