drizzle-orm 0.9.1 → 0.9.5

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 (135) hide show
  1. package/builders/aggregators/abstractAggregator.d.ts +3 -4
  2. package/builders/aggregators/abstractAggregator.js +5 -8
  3. package/builders/aggregators/deleteAggregator.d.ts +2 -1
  4. package/builders/aggregators/deleteAggregator.js +10 -4
  5. package/builders/aggregators/insertAggregator.d.ts +4 -6
  6. package/builders/aggregators/insertAggregator.js +37 -44
  7. package/builders/aggregators/selectAggregator.d.ts +8 -5
  8. package/builders/aggregators/selectAggregator.js +50 -31
  9. package/builders/aggregators/updateAggregator.d.ts +2 -1
  10. package/builders/aggregators/updateAggregator.js +6 -4
  11. package/builders/highLvlBuilders/abstractRequestBuilder.d.ts +4 -3
  12. package/builders/highLvlBuilders/abstractRequestBuilder.js +2 -2
  13. package/builders/highLvlBuilders/deleteRequestBuilder.d.ts +5 -4
  14. package/builders/highLvlBuilders/deleteRequestBuilder.js +8 -9
  15. package/builders/highLvlBuilders/insertRequestBuilder.d.ts +2 -4
  16. package/builders/highLvlBuilders/insertRequestBuilder.js +17 -24
  17. package/builders/highLvlBuilders/selectRequestBuilder.d.ts +5 -4
  18. package/builders/highLvlBuilders/selectRequestBuilder.js +29 -32
  19. package/builders/highLvlBuilders/updateRequestBuilder.d.ts +5 -4
  20. package/builders/highLvlBuilders/updateRequestBuilder.js +9 -9
  21. package/builders/index.d.ts +1 -1
  22. package/builders/index.js +2 -1
  23. package/builders/joinBuilders/builders/abstractJoinBuilder.d.ts +18 -9
  24. package/builders/joinBuilders/builders/abstractJoinBuilder.js +34 -4
  25. package/builders/joinBuilders/builders/selectWithFiveJoins.d.ts +23 -0
  26. package/builders/joinBuilders/builders/selectWithFiveJoins.js +33 -0
  27. package/builders/joinBuilders/builders/selectWithFourJoins.d.ts +23 -6
  28. package/builders/joinBuilders/builders/selectWithFourJoins.js +52 -36
  29. package/builders/joinBuilders/builders/selectWithJoin.d.ts +9 -6
  30. package/builders/joinBuilders/builders/selectWithJoin.js +15 -35
  31. package/builders/joinBuilders/builders/selectWithThreeJoins.d.ts +9 -6
  32. package/builders/joinBuilders/builders/selectWithThreeJoins.js +19 -39
  33. package/builders/joinBuilders/builders/selectWithTwoJoins.d.ts +9 -6
  34. package/builders/joinBuilders/builders/selectWithTwoJoins.js +17 -38
  35. package/builders/joinBuilders/responses/selectResponseFiveJoins.d.ts +19 -0
  36. package/builders/joinBuilders/responses/selectResponseFiveJoins.js +35 -0
  37. package/builders/joinBuilders/responses/selectResponseFourJoins.d.ts +8 -0
  38. package/builders/joinBuilders/responses/selectResponseFourJoins.js +15 -4
  39. package/builders/joinBuilders/responses/selectResponseThreeJoins.d.ts +8 -0
  40. package/builders/joinBuilders/responses/selectResponseThreeJoins.js +15 -0
  41. package/builders/joinBuilders/responses/selectResponseTwoJoins.d.ts +8 -0
  42. package/builders/joinBuilders/responses/selectResponseTwoJoins.js +15 -0
  43. package/builders/joinBuilders/responses/selectResponseWithJoin.d.ts +8 -0
  44. package/builders/joinBuilders/responses/selectResponseWithJoin.js +15 -0
  45. package/builders/lowLvlBuilders/create.js +1 -1
  46. package/builders/lowLvlBuilders/delets/delete.d.ts +2 -1
  47. package/builders/lowLvlBuilders/delets/delete.js +3 -3
  48. package/builders/lowLvlBuilders/inserts/insert.d.ts +2 -3
  49. package/builders/lowLvlBuilders/inserts/insert.js +3 -3
  50. package/builders/lowLvlBuilders/inserts/insertInto.d.ts +2 -4
  51. package/builders/lowLvlBuilders/inserts/insertInto.js +2 -1
  52. package/builders/lowLvlBuilders/inserts/valuesInsert.d.ts +3 -5
  53. package/builders/lowLvlBuilders/inserts/valuesInsert.js +3 -3
  54. package/builders/lowLvlBuilders/selects/select.d.ts +2 -3
  55. package/builders/lowLvlBuilders/selects/select.js +3 -3
  56. package/builders/lowLvlBuilders/selects/selectFrom.d.ts +5 -4
  57. package/builders/lowLvlBuilders/selects/selectFrom.js +6 -0
  58. package/builders/lowLvlBuilders/selects/selectJoined.d.ts +5 -5
  59. package/builders/lowLvlBuilders/selects/whereSelect.d.ts +4 -4
  60. package/builders/lowLvlBuilders/updates/update.d.ts +2 -1
  61. package/builders/lowLvlBuilders/updates/update.js +3 -3
  62. package/builders/lowLvlBuilders/updates/updateIn.d.ts +1 -3
  63. package/builders/lowLvlBuilders/updates/updateIn.js +1 -4
  64. package/builders/requestBuilders/where/const.js +1 -1
  65. package/builders/requestBuilders/where/constArray.js +1 -1
  66. package/builders/requestBuilders/where/isNull.d.ts +6 -0
  67. package/builders/requestBuilders/where/isNull.js +11 -0
  68. package/builders/requestBuilders/where/notEqWhere.d.ts +7 -0
  69. package/builders/requestBuilders/where/notEqWhere.js +12 -0
  70. package/builders/requestBuilders/where/rawWhere.d.ts +6 -0
  71. package/builders/requestBuilders/where/rawWhere.js +11 -0
  72. package/builders/requestBuilders/where/static.d.ts +3 -0
  73. package/builders/requestBuilders/where/static.js +10 -1
  74. package/builders/requestBuilders/where/var.js +1 -1
  75. package/columns/column.d.ts +11 -9
  76. package/columns/column.js +12 -8
  77. package/db/session.js +2 -2
  78. package/{manual.d.ts → docs/cases/simple_delete.d.ts} +0 -0
  79. package/docs/cases/simple_delete.js +30 -0
  80. package/{tests/cases/commentsTable.test.d.ts → docs/cases/simple_insert.d.ts} +0 -0
  81. package/docs/cases/simple_insert.js +51 -0
  82. package/docs/cases/simple_join.d.ts +1 -0
  83. package/docs/cases/simple_join.js +95 -0
  84. package/docs/cases/simple_select.d.ts +1 -0
  85. package/docs/cases/simple_select.js +39 -0
  86. package/docs/cases/simple_update.d.ts +1 -0
  87. package/docs/cases/simple_update.js +33 -0
  88. package/docs/tables/citiesTable.d.ts +14 -0
  89. package/{examples/tables/authOtpTable.js → docs/tables/citiesTable.js} +6 -9
  90. package/docs/tables/citiesToUsers.d.ts +7 -0
  91. package/docs/tables/citiesToUsers.js +18 -0
  92. package/docs/tables/userGroupsTable.d.ts +7 -0
  93. package/docs/tables/userGroupsTable.js +15 -0
  94. package/{examples → docs}/tables/usersTable.d.ts +7 -4
  95. package/{examples → docs}/tables/usersTable.js +11 -6
  96. package/docs/tables/usersToUserGroups.d.ts +7 -0
  97. package/docs/tables/usersToUserGroups.js +18 -0
  98. package/{examples → docs}/types/rolesType.d.ts +0 -0
  99. package/{examples → docs}/types/rolesType.js +1 -1
  100. package/indexes/tableIndex.d.ts +3 -1
  101. package/indexes/tableIndex.js +3 -1
  102. package/package.json +1 -1
  103. package/serializer/serializer.d.ts +40 -0
  104. package/serializer/serializer.js +74 -0
  105. package/tables/abstractTable.d.ts +4 -2
  106. package/tables/abstractTable.js +10 -10
  107. package/test.d.ts +1 -0
  108. package/test.js +38 -25
  109. package/examples/tables/authOtpTable.d.ts +0 -12
  110. package/examples/tables/cityTable.d.ts +0 -8
  111. package/examples/tables/cityTable.js +0 -17
  112. package/examples/testEnum.d.ts +0 -6
  113. package/examples/testEnum.js +0 -10
  114. package/manual.js +0 -27
  115. package/tests/cases/commentsTable.test.js +0 -66
  116. package/tests/cases/messagesTable.test1.d.ts +0 -0
  117. package/tests/cases/messagesTable.test1.js +0 -1
  118. package/tests/cases/postsTable.test1.d.ts +0 -0
  119. package/tests/cases/postsTable.test1.js +0 -1
  120. package/tests/cases/usersTable.test1.d.ts +0 -0
  121. package/tests/cases/usersTable.test1.js +0 -1
  122. package/tests/tables/citiesTable.d.ts +0 -6
  123. package/tests/tables/citiesTable.js +0 -14
  124. package/tests/tables/commentsTable.d.ts +0 -0
  125. package/tests/tables/commentsTable.js +0 -1
  126. package/tests/tables/likesTable.d.ts +0 -0
  127. package/tests/tables/likesTable.js +0 -1
  128. package/tests/tables/messagesTable.d.ts +0 -0
  129. package/tests/tables/messagesTable.js +0 -1
  130. package/tests/tables/postsTable.d.ts +0 -0
  131. package/tests/tables/postsTable.js +0 -1
  132. package/tests/tables/userFollowers.d.ts +0 -0
  133. package/tests/tables/userFollowers.js +0 -1
  134. package/tests/tables/usersTable.d.ts +0 -8
  135. package/tests/tables/usersTable.js +0 -20
@@ -1,10 +1,9 @@
1
1
  import { AbstractColumn } from '../../columns/column';
2
2
  import ColumnType from '../../columns/types/columnType';
3
+ import { AbstractTable } from '../../tables';
3
4
  export default class Aggregator {
4
5
  protected _fields: Array<string>;
5
- protected _tableName: string;
6
- protected _columnsTypes: AbstractColumn<ColumnType>[];
7
- constructor(tableName: string);
8
- appendFields: (columns: AbstractColumn<ColumnType>[]) => void;
6
+ protected _table: AbstractTable<any>;
7
+ constructor(table: AbstractTable<any>);
9
8
  protected generateSelectArray: (table: string, columns: AbstractColumn<ColumnType>[]) => string[];
10
9
  }
@@ -3,12 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const column_1 = require("../../columns/column");
4
4
  const ecranate_1 = require("../../utils/ecranate");
5
5
  class Aggregator {
6
- constructor(tableName) {
6
+ constructor(table) {
7
7
  this._fields = [];
8
- this.appendFields = (columns) => {
9
- this._fields = this.generateSelectArray(this._tableName, columns);
10
- this._columnsTypes = columns;
11
- };
12
8
  this.generateSelectArray = (table, columns) => {
13
9
  const selectFields = [];
14
10
  columns.forEach((field) => {
@@ -16,16 +12,17 @@ class Aggregator {
16
12
  selectFields.push(' ');
17
13
  selectFields.push(table);
18
14
  selectFields.push('.');
19
- selectFields.push((0, ecranate_1.ecranate)(field.getColumnName()));
15
+ selectFields.push(ecranate_1.ecranate(field.getColumnName()));
20
16
  selectFields.push(' AS ');
21
- selectFields.push((0, ecranate_1.ecranate)(`${table.replace('.', '_')}_${field.getColumnName()}`));
17
+ selectFields.push(ecranate_1.ecranate(`${table.replace('.', '_')}_${field.getColumnName()}`));
22
18
  selectFields.push(',');
23
19
  }
24
20
  });
25
21
  selectFields.pop();
26
22
  return selectFields;
27
23
  };
28
- this._tableName = tableName;
24
+ this._table = table;
25
+ this._fields = this.generateSelectArray(this._table.tableName(), Object.values(this._table.mapServiceToDb()));
29
26
  }
30
27
  }
31
28
  exports.default = Aggregator;
@@ -1,10 +1,11 @@
1
+ import { AbstractTable } from '../../tables';
1
2
  import Expr from '../requestBuilders/where/where';
2
3
  import Aggregator from './abstractAggregator';
3
4
  export default class DeleteAggregator extends Aggregator {
4
5
  private _from;
5
6
  private _filters;
6
7
  private _delete;
7
- constructor(tableName: string);
8
+ constructor(table: AbstractTable<any>);
8
9
  filters: (filters: Expr) => DeleteAggregator;
9
10
  appendFrom: (tableName: string) => DeleteAggregator;
10
11
  buildQuery: () => string;
@@ -2,14 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const abstractAggregator_1 = require("./abstractAggregator");
4
4
  class DeleteAggregator extends abstractAggregator_1.default {
5
- constructor(tableName) {
6
- super(tableName);
5
+ constructor(table) {
6
+ super(table);
7
7
  this._from = [];
8
8
  this._filters = [];
9
9
  this._delete = ['DELETE'];
10
10
  this.filters = (filters) => {
11
- this._filters.push('WHERE ');
12
- this._filters.push(filters.toQuery());
11
+ if (filters) {
12
+ this._filters.push('WHERE ');
13
+ this._filters.push(filters.toQuery());
14
+ }
13
15
  return this;
14
16
  };
15
17
  this.appendFrom = (tableName) => {
@@ -23,6 +25,10 @@ class DeleteAggregator extends abstractAggregator_1.default {
23
25
  this._delete.push(this._from.join(''));
24
26
  this._delete.push('\n');
25
27
  this._delete.push(this._filters.join(''));
28
+ this._delete.push('\n');
29
+ this._delete.push('RETURNING');
30
+ this._delete.push('\n');
31
+ this._delete.push(this._fields.join(''));
26
32
  return this._delete.join('');
27
33
  };
28
34
  }
@@ -1,5 +1,4 @@
1
- import { Column } from '../../columns/column';
2
- import ColumnType from '../../columns/types/columnType';
1
+ import { AbstractTable } from '../../tables';
3
2
  import { Indexing } from '../../tables/inferTypes';
4
3
  import UpdateExpr from '../requestBuilders/updates/updates';
5
4
  import Aggregator from './abstractAggregator';
@@ -9,10 +8,9 @@ export default class InsertAggregator extends Aggregator {
9
8
  private _values;
10
9
  private _from;
11
10
  private _insert;
12
- constructor(tableName: string);
13
- appendFrom: (tableName: string) => InsertAggregator;
14
- appendColumns: <T>(values: T[]) => void;
15
- appendValues: <T>(mapper: { [name in keyof T]: Column<ColumnType<{}>, true, false>; }, values: {
11
+ constructor(table: AbstractTable<any>);
12
+ appendColumns: () => void;
13
+ appendValues: (values: {
16
14
  [name: string]: any;
17
15
  }[]) => void;
18
16
  appendOnConflict: (column: Indexing, updates?: UpdateExpr | undefined) => this;
@@ -3,57 +3,52 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const column_1 = require("../../columns/column");
4
4
  const abstractAggregator_1 = require("./abstractAggregator");
5
5
  class InsertAggregator extends abstractAggregator_1.default {
6
- constructor(tableName) {
7
- super(tableName);
6
+ constructor(table) {
7
+ super(table);
8
8
  this._onConflict = [];
9
9
  this._columns = [];
10
10
  this._values = [];
11
11
  this._from = [];
12
12
  this._insert = ['INSERT INTO'];
13
- this.appendFrom = (tableName) => {
14
- this._from.push(' ');
15
- this._from.push(tableName);
16
- this._tableName = tableName;
17
- return this;
18
- };
19
- // @TODO refactor!!
20
- this.appendColumns = (values) => {
21
- // @TODO Check if values not empty
22
- const columns = Object.keys(values[0]);
13
+ this.appendColumns = () => {
14
+ const mapper = this._table.mapServiceToDb();
15
+ const columns = Object.values(mapper);
23
16
  for (let i = 0; i < columns.length; i += 1) {
24
17
  const column = columns[i];
25
18
  this._columns.push('"');
26
- this._columns.push(column);
19
+ this._columns.push(column.getColumnName());
27
20
  this._columns.push('"');
28
21
  if (i < columns.length - 1) {
29
22
  this._columns.push(', ');
30
23
  }
31
24
  }
32
25
  };
33
- // @TODO refactor!!
34
- this.appendValues = (mapper, values) => {
26
+ this.appendValues = (values) => {
35
27
  // @TODO Check if values not empty
28
+ const mapper = this._table.mapServiceToDb();
36
29
  for (let i = 0; i < values.length; i += 1) {
37
30
  const value = values[i];
38
- const insertValues = Object.values(value);
39
- const insertKeys = Object.keys(value);
40
31
  this._values.push('(');
41
- for (let j = 0; j < insertValues.length; j += 1) {
42
- const insertValue = insertValues[j];
43
- const insertKey = insertKeys[j];
44
- const columnKey = Object.keys(mapper)
45
- .find((it) => mapper[it].getColumnName() === insertKey);
46
- const column = mapper[columnKey];
47
- if (insertValue !== undefined && insertValue !== null) {
48
- this._values.push(column.getColumnType().insertStrategy(insertValue));
32
+ const entries = Object.entries(mapper);
33
+ entries.forEach(([key], index) => {
34
+ const valueToInsert = value[key];
35
+ const isKeyExistsInValue = key.toString() in value;
36
+ const column = mapper[key];
37
+ if (isKeyExistsInValue) {
38
+ if (valueToInsert !== undefined && valueToInsert !== null) {
39
+ this._values.push(column.getColumnType().insertStrategy(valueToInsert));
40
+ }
41
+ else {
42
+ this._values.push('null');
43
+ }
49
44
  }
50
45
  else {
51
- this._values.push('null');
46
+ this._values.push('DEFAULT');
52
47
  }
53
- if (j < insertValues.length - 1) {
48
+ if (index < entries.length - 1) {
54
49
  this._values.push(', ');
55
50
  }
56
- }
51
+ });
57
52
  if (i < values.length - 1) {
58
53
  this._values.push('),\n');
59
54
  }
@@ -63,14 +58,17 @@ class InsertAggregator extends abstractAggregator_1.default {
63
58
  }
64
59
  };
65
60
  this.appendOnConflict = (column, updates) => {
66
- const indexName = column instanceof column_1.IndexedColumn ? column.getColumnName() : column.indexName();
67
- this._onConflict.push(`ON CONFLICT ON CONSTRAINT ${indexName}\n`);
68
- if (updates) {
69
- this._onConflict.push('DO UPDATE\n');
70
- this._onConflict.push(`SET ${updates.toQuery()}`);
71
- }
72
- else {
73
- this._onConflict.push('DO NOTHING\n');
61
+ if (column) {
62
+ const indexName = column instanceof column_1.IndexedColumn
63
+ ? column.getColumnName() : column.getColumns().map((it) => it.getColumnName()).join(',');
64
+ this._onConflict.push(`ON CONFLICT (${indexName})\n`);
65
+ if (updates) {
66
+ this._onConflict.push('DO UPDATE\n');
67
+ this._onConflict.push(`SET ${updates.toQuery()}`);
68
+ }
69
+ else {
70
+ this._onConflict.push('DO NOTHING\n');
71
+ }
74
72
  }
75
73
  return this;
76
74
  };
@@ -82,20 +80,15 @@ class InsertAggregator extends abstractAggregator_1.default {
82
80
  this._insert.push('VALUES\n');
83
81
  this._insert.push(this._values.join(''));
84
82
  this._insert.push('\n');
83
+ this._insert.push(this._onConflict.join(''));
85
84
  this._insert.push('\n');
86
85
  this._insert.push('RETURNING');
87
86
  this._insert.push('\n');
88
87
  this._insert.push(this._fields.join(''));
89
- this._insert.push('\n');
90
- this._insert.push(this._onConflict.join(''));
91
- // this._insert.push("ON CONFLICT ON CONSTRAINT \"");
92
- // this._insert.push(this._table.tableName());
93
- // this._insert.push("_");
94
- // this._insert.push(this._table);
95
- // this._insert.push("\n");
96
- // this._insert.push(this._fields.join(''));
97
88
  return this._insert.join('');
98
89
  };
90
+ this._from.push(' ');
91
+ this._from.push(table.tableName());
99
92
  }
100
93
  }
101
94
  exports.default = InsertAggregator;
@@ -1,5 +1,6 @@
1
1
  import { AbstractColumn } from '../../columns/column';
2
2
  import ColumnType from '../../columns/types/columnType';
3
+ import { AbstractTable } from '../../tables';
3
4
  import Order from '../highLvlBuilders/order';
4
5
  import Join from '../joinBuilders/join';
5
6
  import Expr from '../requestBuilders/where/where';
@@ -11,13 +12,15 @@ export default class SelectAggregator extends Aggregator {
11
12
  private _join;
12
13
  private _limit;
13
14
  private _offset;
15
+ private _distinct;
14
16
  private _orderBy;
15
- constructor(tableName: string);
17
+ constructor(table: AbstractTable<any>);
16
18
  filters: (filters: Expr) => SelectAggregator;
17
- limit: (limit: number) => SelectAggregator;
18
- offset: (limit: number) => SelectAggregator;
19
- orderBy: (column: AbstractColumn<ColumnType, boolean, boolean>, order: Order) => SelectAggregator;
19
+ limit: (limit?: number | undefined) => SelectAggregator;
20
+ 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;
20
23
  appendFrom: (tableName: string) => SelectAggregator;
21
- join: (joins: Array<Join<{}>>) => SelectAggregator;
24
+ join: (joins: Array<Join<any> | undefined>) => SelectAggregator;
22
25
  buildQuery: () => string;
23
26
  }
@@ -1,37 +1,53 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ecranate_1 = require("../../utils/ecranate");
3
4
  const order_1 = require("../highLvlBuilders/order");
4
5
  const abstractAggregator_1 = require("./abstractAggregator");
5
6
  class SelectAggregator extends abstractAggregator_1.default {
6
- constructor(tableName) {
7
- super(tableName);
7
+ constructor(table) {
8
+ super(table);
8
9
  this._from = [];
9
10
  this._filters = [];
10
11
  this._select = ['SELECT'];
11
12
  this._join = [];
12
13
  this._limit = [];
13
14
  this._offset = [];
15
+ this._distinct = [];
14
16
  // private _groupBy: Array<string> = [];
15
17
  this._orderBy = [];
16
18
  this.filters = (filters) => {
17
- this._filters.push('WHERE ');
18
- this._filters.push(filters.toQuery());
19
+ if (filters) {
20
+ this._filters.push('WHERE ');
21
+ this._filters.push(filters.toQuery());
22
+ }
19
23
  return this;
20
24
  };
21
25
  this.limit = (limit) => {
22
- this._limit.push('LIMIT ');
23
- this._limit.push(limit.toString());
26
+ if (limit) {
27
+ this._limit.push('LIMIT ');
28
+ this._limit.push(limit.toString());
29
+ }
24
30
  return this;
25
31
  };
26
- this.offset = (limit) => {
27
- this._offset.push('OFFSET ');
28
- this._offset.push(limit.toString());
32
+ this.offset = (offset) => {
33
+ if (offset) {
34
+ this._offset.push('OFFSET ');
35
+ this._offset.push(offset.toString());
36
+ }
29
37
  return this;
30
38
  };
31
39
  this.orderBy = (column, order) => {
32
- this._orderBy.push('ORDER BY ');
33
- this._orderBy.push(`${column.getColumnName()} `);
34
- this._orderBy.push(order_1.default[order]);
40
+ if (column !== null && column !== undefined) {
41
+ this._orderBy.push('ORDER BY ');
42
+ this._orderBy.push(`${column.getColumnName()} `);
43
+ this._orderBy.push(order_1.default[order]);
44
+ }
45
+ return this;
46
+ };
47
+ this.distinct = (column) => {
48
+ if (column) {
49
+ this._distinct.push(` DISTINCT ON(${column.getParent()}.${ecranate_1.ecranate(column.getColumnName())}) `);
50
+ }
35
51
  return this;
36
52
  };
37
53
  this.appendFrom = (tableName) => {
@@ -42,29 +58,32 @@ class SelectAggregator extends abstractAggregator_1.default {
42
58
  // Add select generator for second table also
43
59
  this.join = (joins) => {
44
60
  joins.forEach((join) => {
45
- const tableFrom = join.fromColumn.getParentName();
46
- const tableTo = join.toColumn.getParentName();
47
- const { type } = join;
48
- const selectString = this.generateSelectArray(tableTo, Object.values(join.mappedServiceToDb)).join('');
49
- this._fields.push(', ');
50
- this._fields.push(selectString);
51
- this._join.push('\n');
52
- this._join.push(type);
53
- this._join.push(' ');
54
- this._join.push(tableTo);
55
- this._join.push('\n');
56
- this._join.push('ON ');
57
- this._join.push(tableFrom);
58
- this._join.push('.');
59
- this._join.push(join.fromColumn.getColumnName());
60
- this._join.push(' = ');
61
- this._join.push(tableTo);
62
- this._join.push('.');
63
- this._join.push(join.toColumn.getColumnName());
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('');
66
+ this._fields.push(', ');
67
+ this._fields.push(selectString);
68
+ this._join.push('\n');
69
+ this._join.push(type);
70
+ this._join.push(' ');
71
+ this._join.push(tableTo);
72
+ this._join.push('\n');
73
+ this._join.push('ON ');
74
+ this._join.push(tableFrom);
75
+ this._join.push('.');
76
+ this._join.push(join.fromColumn.getColumnName());
77
+ this._join.push(' = ');
78
+ this._join.push(tableTo);
79
+ this._join.push('.');
80
+ this._join.push(join.toColumn.getColumnName());
81
+ }
64
82
  });
65
83
  return this;
66
84
  };
67
85
  this.buildQuery = () => {
86
+ this._select.push(this._distinct.join(''));
68
87
  this._select.push(this._fields.join(''));
69
88
  this._select.push('\n');
70
89
  this._select.push(this._from.join(''));
@@ -1,3 +1,4 @@
1
+ import { AbstractTable } from '../../tables';
1
2
  import UpdateExpr from '../requestBuilders/updates/updates';
2
3
  import Expr from '../requestBuilders/where/where';
3
4
  import Aggregator from './abstractAggregator';
@@ -6,7 +7,7 @@ export default class UpdateAggregator extends Aggregator {
6
7
  private _filters;
7
8
  private _from;
8
9
  private _update;
9
- constructor(tableName: string);
10
+ constructor(table: AbstractTable<any>);
10
11
  where: (filters: Expr) => UpdateAggregator;
11
12
  appendFrom: (tableName: string) => UpdateAggregator;
12
13
  set: (updates: UpdateExpr) => UpdateAggregator;
@@ -2,15 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const abstractAggregator_1 = require("./abstractAggregator");
4
4
  class UpdateAggregator extends abstractAggregator_1.default {
5
- constructor(tableName) {
6
- super(tableName);
5
+ constructor(table) {
6
+ super(table);
7
7
  this._updates = [];
8
8
  this._filters = [];
9
9
  this._from = [];
10
10
  this._update = ['UPDATE'];
11
11
  this.where = (filters) => {
12
- this._filters.push('WHERE ');
13
- this._filters.push(filters.toQuery());
12
+ if (filters) {
13
+ this._filters.push('WHERE ');
14
+ this._filters.push(filters.toQuery());
15
+ }
14
16
  return this;
15
17
  };
16
18
  this.appendFrom = (tableName) => {
@@ -2,16 +2,17 @@ import { AbstractColumn } from '../../columns/column';
2
2
  import ColumnType from '../../columns/types/columnType';
3
3
  import Session from '../../db/session';
4
4
  import BaseLogger from '../../logger/abstractLogger';
5
+ import { AbstractTable } from '../../tables';
5
6
  import { ExtractModel } from '../../tables/inferTypes';
6
- export default abstract class TableRequestBuilder<TTable> {
7
- protected _tableName: string;
7
+ export default abstract class TableRequestBuilder<TTable extends AbstractTable<TTable>> {
8
+ protected _table: TTable;
8
9
  protected _session: Session;
9
10
  protected _mappedServiceToDb: {
10
11
  [name in keyof ExtractModel<TTable>]: AbstractColumn<ColumnType>;
11
12
  };
12
13
  protected _columns: AbstractColumn<ColumnType>[];
13
14
  protected _logger?: BaseLogger;
14
- constructor(tableName: string, session: Session, mappedServiceToDb: {
15
+ constructor(table: AbstractTable<TTable>, session: Session, mappedServiceToDb: {
15
16
  [name in keyof ExtractModel<TTable>]: AbstractColumn<ColumnType>;
16
17
  }, logger?: BaseLogger);
17
18
  all: () => Promise<Array<ExtractModel<TTable> | undefined>>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  class TableRequestBuilder {
4
- constructor(tableName, session, mappedServiceToDb, logger) {
4
+ constructor(table, session, mappedServiceToDb, logger) {
5
5
  this.all = async () => {
6
6
  const res = await this._execute();
7
7
  return res;
@@ -12,7 +12,7 @@ class TableRequestBuilder {
12
12
  return executionRes[0];
13
13
  };
14
14
  this._mappedServiceToDb = mappedServiceToDb;
15
- this._tableName = tableName;
15
+ this._table = table;
16
16
  this._session = session;
17
17
  this._columns = Object.values(mappedServiceToDb);
18
18
  this._logger = logger;
@@ -1,14 +1,15 @@
1
- import { Column } from '../../columns/column';
1
+ import { AbstractColumn } from '../../columns/column';
2
2
  import ColumnType from '../../columns/types/columnType';
3
3
  import Session from '../../db/session';
4
4
  import BaseLogger from '../../logger/abstractLogger';
5
+ import { AbstractTable } from '../../tables';
5
6
  import { ExtractModel } from '../../tables/inferTypes';
6
7
  import Expr from '../requestBuilders/where/where';
7
8
  import TableRequestBuilder from './abstractRequestBuilder';
8
- export default class DeleteTRB<TTable> extends TableRequestBuilder<TTable> {
9
+ export default class DeleteTRB<TTable extends AbstractTable<TTable>> extends TableRequestBuilder<TTable> {
9
10
  private _filter;
10
- constructor(tableName: string, session: Session, mappedServiceToDb: {
11
- [name in keyof ExtractModel<TTable>]: Column<ColumnType>;
11
+ constructor(table: AbstractTable<TTable>, session: Session, mappedServiceToDb: {
12
+ [name in keyof ExtractModel<TTable>]: AbstractColumn<ColumnType>;
12
13
  }, logger?: BaseLogger);
13
14
  where: (expr: Expr) => DeleteTRB<TTable>;
14
15
  execute: () => Promise<void>;
@@ -6,8 +6,8 @@ const responseMapper_1 = require("../../mappers/responseMapper");
6
6
  const delete_1 = require("../lowLvlBuilders/delets/delete");
7
7
  const abstractRequestBuilder_1 = require("./abstractRequestBuilder");
8
8
  class DeleteTRB extends abstractRequestBuilder_1.default {
9
- constructor(tableName, session, mappedServiceToDb, logger) {
10
- super(tableName, session, mappedServiceToDb, logger);
9
+ constructor(table, session, mappedServiceToDb, logger) {
10
+ super(table, session, mappedServiceToDb, logger);
11
11
  this.where = (expr) => {
12
12
  this._filter = expr;
13
13
  return this;
@@ -16,24 +16,23 @@ class DeleteTRB extends abstractRequestBuilder_1.default {
16
16
  await this._execute();
17
17
  };
18
18
  this._execute = async () => {
19
- const queryBuilder = delete_1.default.from(this._tableName);
20
- if (this._filter) {
21
- queryBuilder.filteredBy(this._filter);
22
- }
19
+ const queryBuilder = delete_1.default
20
+ .from(this._table)
21
+ .filteredBy(this._filter);
23
22
  let query = '';
24
23
  try {
25
24
  query = queryBuilder.build();
26
25
  }
27
26
  catch (e) {
28
- throw new builderError_1.default(builderError_1.BuilderType.DELETE, this._tableName, this._columns, e, this._filter);
27
+ throw new builderError_1.default(builderError_1.BuilderType.DELETE, this._table.tableName(), this._columns, e, this._filter);
29
28
  }
30
29
  if (this._logger) {
31
- this._logger.info(`Deleting from ${this._tableName} using query:\n ${query}`);
30
+ this._logger.info(`Deleting from ${this._table.tableName()} using query:\n ${query}`);
32
31
  }
33
32
  const result = await this._session.execute(query);
34
33
  if (result.isLeft()) {
35
34
  const { reason } = result.value;
36
- throw new dbErrors_1.DatabaseDeleteError(this._tableName, reason, query);
35
+ throw new dbErrors_1.DatabaseDeleteError(this._table.tableName(), reason, query);
37
36
  }
38
37
  else {
39
38
  return responseMapper_1.default.map(this._mappedServiceToDb, result.value);
@@ -4,17 +4,15 @@ import Session from '../../db/session';
4
4
  import BaseLogger from '../../logger/abstractLogger';
5
5
  import { AbstractTable } from '../../tables';
6
6
  import { ExtractModel, Indexing } from '../../tables/inferTypes';
7
- import UpdateExpr from '../requestBuilders/updates/updates';
8
7
  import TableRequestBuilder from './abstractRequestBuilder';
9
8
  export default class InsertTRB<TTable extends AbstractTable<TTable>> extends TableRequestBuilder<TTable> {
10
9
  private _values;
11
10
  private _onConflict;
12
11
  private _onConflictField;
13
- private _table;
14
- constructor(values: ExtractModel<TTable>[], tableName: string, session: Session, mappedServiceToDb: {
12
+ constructor(values: ExtractModel<TTable>[], session: Session, mappedServiceToDb: {
15
13
  [name in keyof ExtractModel<TTable>]: AbstractColumn<ColumnType>;
16
14
  }, table: AbstractTable<TTable>, logger?: BaseLogger);
17
15
  execute: () => Promise<void>;
18
- onConflict: (callback: (table: TTable) => Indexing, expr: UpdateExpr) => InsertTRB<TTable>;
16
+ onConflict: (callback: (table: TTable) => Indexing, update: Partial<ExtractModel<TTable>>) => InsertTRB<TTable>;
19
17
  protected _execute: () => Promise<Array<ExtractModel<TTable> | undefined>>;
20
18
  }
@@ -1,61 +1,54 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const __1 = require("..");
3
4
  const builderError_1 = require("../../errors/builderError");
4
5
  const dbErrors_1 = require("../../errors/dbErrors");
5
6
  const responseMapper_1 = require("../../mappers/responseMapper");
6
7
  const insert_1 = require("../lowLvlBuilders/inserts/insert");
7
8
  const abstractRequestBuilder_1 = require("./abstractRequestBuilder");
8
9
  class InsertTRB extends abstractRequestBuilder_1.default {
9
- constructor(values, tableName, session, mappedServiceToDb, table, logger) {
10
- super(tableName, session, mappedServiceToDb, logger);
10
+ constructor(values, session, mappedServiceToDb, table, logger) {
11
+ super(table, session, mappedServiceToDb, logger);
11
12
  this.execute = async () => {
12
13
  await this._execute();
13
14
  };
14
- this.onConflict = (callback, expr) => {
15
+ this.onConflict = (callback, update) => {
15
16
  this._onConflictField = callback(this._table);
16
- this._onConflict = expr;
17
+ const updates = [];
18
+ Object.entries(update).forEach(([key, value]) => {
19
+ const column = this._mappedServiceToDb[key];
20
+ updates.push(__1.set(column, value));
21
+ });
22
+ this._onConflict = __1.combine(updates);
17
23
  return this;
18
24
  };
19
25
  this._execute = async () => {
20
- const queryBuilder = insert_1.default.into(this._tableName, this._columns);
21
26
  if (!this._values)
22
27
  throw Error('Values should be provided firestly\nExample: table.values().execute()');
23
- const mappedRows = [];
24
- const mapper = this._mappedServiceToDb;
25
- this._values.forEach((valueToInsert) => {
26
- const mappedValue = {};
27
- Object.entries(valueToInsert).forEach(([key, value]) => {
28
- const column = mapper[key];
29
- mappedValue[column.getColumnName()] = value;
30
- });
31
- mappedRows.push(mappedValue);
32
- });
33
- const valuesQueryBiulder = queryBuilder.values(mappedRows, mapper);
34
- if (this._onConflict) {
35
- valuesQueryBiulder.onConflict(this._onConflict, this._onConflictField);
36
- }
37
- // @TODO refactor values() part!!
28
+ const queryBuilder = insert_1.default
29
+ .into(this._table)
30
+ .values(this._values)
31
+ .onConflict(this._onConflict, this._onConflictField);
38
32
  let query = '';
39
33
  try {
40
34
  query = queryBuilder.build();
41
35
  }
42
36
  catch (e) {
43
- throw new builderError_1.default(builderError_1.BuilderType.INSERT, this._tableName, this._columns, e);
37
+ throw new builderError_1.default(builderError_1.BuilderType.INSERT, this._table.tableName(), this._columns, e);
44
38
  }
45
39
  if (this._logger) {
46
- this._logger.info(`Inserting to ${this._tableName} using query:\n ${query}`);
40
+ this._logger.info(`Inserting to ${this._table.tableName()} using query:\n ${query}`);
47
41
  }
48
42
  const result = await this._session.execute(query);
49
43
  if (result.isLeft()) {
50
44
  const { reason } = result.value;
51
- throw new dbErrors_1.DatabaseInsertError(this._tableName, reason, query);
45
+ throw new dbErrors_1.DatabaseInsertError(this._table.tableName(), reason, query);
52
46
  }
53
47
  else {
54
48
  return responseMapper_1.default.map(this._mappedServiceToDb, result.value);
55
49
  }
56
50
  };
57
51
  this._values = values;
58
- this._table = table;
59
52
  }
60
53
  }
61
54
  exports.default = InsertTRB;