myorm_pg 2.5.2 → 2.6.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 (60) hide show
  1. package/lib/Index.d.ts +32 -32
  2. package/lib/Index.js +53 -53
  3. package/lib/core/decorators/SchemasDecorators.d.ts +44 -44
  4. package/lib/core/decorators/SchemasDecorators.js +144 -144
  5. package/lib/core/decorators/SchemasDecorators.js.map +1 -1
  6. package/lib/core/design/Type.d.ts +38 -37
  7. package/lib/core/design/Type.d.ts.map +1 -1
  8. package/lib/core/design/Type.js +142 -137
  9. package/lib/core/design/Type.js.map +1 -1
  10. package/lib/core/enums/DBTypes.d.ts +18 -18
  11. package/lib/core/enums/DBTypes.js +22 -22
  12. package/lib/core/enums/DBTypes.js.map +1 -1
  13. package/lib/core/enums/RelationType.d.ts +6 -6
  14. package/lib/core/enums/RelationType.js +10 -10
  15. package/lib/core/enums/RelationType.js.map +1 -1
  16. package/lib/core/exceptions/ConnectionFailException.d.ts +4 -4
  17. package/lib/core/exceptions/ConnectionFailException.js +12 -12
  18. package/lib/core/exceptions/ConstraintFailException.d.ts +4 -4
  19. package/lib/core/exceptions/ConstraintFailException.js +12 -12
  20. package/lib/core/exceptions/Exception.d.ts +4 -4
  21. package/lib/core/exceptions/Exception.js +9 -9
  22. package/lib/core/exceptions/InvalidOperationException.d.ts +5 -5
  23. package/lib/core/exceptions/InvalidOperationException.js +13 -13
  24. package/lib/core/exceptions/NotImplementedException.d.ts +4 -4
  25. package/lib/core/exceptions/NotImplementedException.js +12 -12
  26. package/lib/core/exceptions/QueryFailException.d.ts +5 -5
  27. package/lib/core/exceptions/QueryFailException.js +13 -13
  28. package/lib/core/exceptions/TypeNotSuportedException.d.ts +4 -4
  29. package/lib/core/exceptions/TypeNotSuportedException.js +12 -12
  30. package/lib/core/objects/DBOperationLogHandler.d.ts +15 -15
  31. package/lib/core/objects/DBOperationLogHandler.js +16 -16
  32. package/lib/core/objects/DBOperationLogHandler.js.map +1 -1
  33. package/lib/core/objects/interfaces/IDBConnection.d.ts +13 -13
  34. package/lib/core/objects/interfaces/IDBConnection.js +2 -2
  35. package/lib/core/objects/interfaces/IDBContext.d.ts +41 -41
  36. package/lib/core/objects/interfaces/IDBContext.js +2 -2
  37. package/lib/core/objects/interfaces/IDBManager.d.ts +12 -12
  38. package/lib/core/objects/interfaces/IDBManager.js +2 -2
  39. package/lib/core/objects/interfaces/IDBSet.d.ts +38 -35
  40. package/lib/core/objects/interfaces/IDBSet.d.ts.map +1 -1
  41. package/lib/core/objects/interfaces/IDBSet.js +2 -2
  42. package/lib/core/objects/interfaces/IStatement.d.ts +16 -16
  43. package/lib/core/objects/interfaces/IStatement.js +15 -15
  44. package/lib/core/objects/interfaces/IStatement.js.map +1 -1
  45. package/lib/implementations/PGDBConnection.d.ts +18 -18
  46. package/lib/implementations/PGDBConnection.js +102 -102
  47. package/lib/implementations/PGDBContext.d.ts +55 -55
  48. package/lib/implementations/PGDBContext.js +298 -298
  49. package/lib/implementations/PGDBManager.d.ts +31 -31
  50. package/lib/implementations/PGDBManager.js +242 -242
  51. package/lib/implementations/PGDBSet.d.ts +52 -48
  52. package/lib/implementations/PGDBSet.d.ts.map +1 -1
  53. package/lib/implementations/PGDBSet.js +984 -928
  54. package/lib/implementations/PGDBSet.js.map +1 -1
  55. package/lib/implementations/PGFluentField.d.ts +17 -17
  56. package/lib/implementations/PGFluentField.js +153 -153
  57. package/lib/implementations/PGSetHelper.d.ts +18 -18
  58. package/lib/implementations/PGSetHelper.js +47 -47
  59. package/lib/implementations/PGSetHelper.js.map +1 -1
  60. package/package.json +1 -1
@@ -1,299 +1,299 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.JoinSelectable = exports.JoiningQuery = void 0;
16
- const SchemasDecorators_1 = __importDefault(require("../core/decorators/SchemasDecorators"));
17
- const Type_1 = __importDefault(require("../core/design/Type"));
18
- const ConstraintFailException_1 = __importDefault(require("../core/exceptions/ConstraintFailException"));
19
- const InvalidOperationException_1 = __importDefault(require("../core/exceptions/InvalidOperationException"));
20
- const PGDBSet_1 = __importDefault(require("./PGDBSet"));
21
- const PGSetHelper_1 = __importDefault(require("./PGSetHelper"));
22
- class PGDBContext {
23
- constructor(manager) {
24
- this._manager = manager;
25
- }
26
- GetMappedTypes() {
27
- if (this._mappedTypes != undefined)
28
- return this._mappedTypes;
29
- this._mappedTypes = [];
30
- let props = Object.keys(this);
31
- for (let prop of props) {
32
- if (this[prop].constructor == PGDBSet_1.default) {
33
- this._mappedTypes.push(this[prop]["_type"]);
34
- }
35
- }
36
- return this._mappedTypes;
37
- }
38
- IsMapped(type) {
39
- return this.GetMappedTypes().filter(t => t == type).length > 0;
40
- }
41
- Collection(cTor) {
42
- for (let prop of Object.keys(this)) {
43
- let type = this[prop]["_type"];
44
- if (type == undefined)
45
- continue;
46
- if (type == cTor)
47
- return this[prop];
48
- }
49
- return undefined;
50
- }
51
- UpdateDatabaseAsync() {
52
- return __awaiter(this, void 0, void 0, function* () {
53
- let dbName = this._manager["_connection"].DataBaseName;
54
- if (!(yield this._manager.CheckDatabase(dbName)))
55
- yield this._manager.CreateDataBase(dbName);
56
- for (let type of this.GetMappedTypes()) {
57
- yield this._manager.UpdateDatabaseForEntity(type);
58
- }
59
- });
60
- }
61
- ExecuteNonQuery(query) {
62
- return __awaiter(this, void 0, void 0, function* () {
63
- yield this._manager.ExecuteNonQuery(query);
64
- });
65
- }
66
- ExecuteQuery(query) {
67
- return __awaiter(this, void 0, void 0, function* () {
68
- return yield this._manager.Execute(query);
69
- });
70
- }
71
- Join(...args) {
72
- return new JoiningQuery(this, args);
73
- }
74
- }
75
- exports.default = PGDBContext;
76
- class JoiningQuery {
77
- constructor(context, stack) {
78
- this._stack = [];
79
- this._onStatements = [];
80
- this._context = context;
81
- this._stack.push(...stack.map(s => { return { Type: s }; }));
82
- let notMappedTypes = this._stack.filter(s => this._context.Collection(s.Type) == undefined);
83
- if (notMappedTypes.length > 0) {
84
- this._stack = [];
85
- throw new InvalidOperationException_1.default(`The type ${notMappedTypes[0].Type.name} is not mapped`);
86
- }
87
- }
88
- On(cT, cKey, uT, uKey) {
89
- this.CheckIfTypeIsAllowed(cT);
90
- this.CheckIfTypeIsAllowed(cT);
91
- let leftIndex = this._stack.findIndex(s => s.Type == cT);
92
- let rightIndex = this._stack.findIndex(s => s.Type == uT);
93
- if (rightIndex - leftIndex != 1)
94
- throw new InvalidOperationException_1.default(`The On statement must follow the same order than Join`);
95
- this._onStatements.push([cKey.toString(), uKey.toString()]);
96
- return this;
97
- }
98
- Where(cT, statement) {
99
- this.CheckIfTypeIsAllowed(cT);
100
- let set = this._context.Collection(cT);
101
- set.Where(statement);
102
- return this;
103
- }
104
- And(cT, statement) {
105
- this.CheckIfTypeIsAllowed(cT);
106
- let set = this._context.Collection(cT);
107
- set.And(statement);
108
- return this;
109
- }
110
- Or(cT, statement) {
111
- this.CheckIfTypeIsAllowed(cT);
112
- let set = this._context.Collection(cT);
113
- set.Or(statement);
114
- return this;
115
- }
116
- Select(cT) {
117
- return new JoinSelectable(cT, this._context, this._stack, this._onStatements);
118
- }
119
- CheckIfTypeIsAllowed(cT) {
120
- let set = this._context.Collection(cT);
121
- if (!set)
122
- throw new InvalidOperationException_1.default(`The type ${cT.name} is not mapped`);
123
- let index = this._stack.findIndex(s => s.Type == cT);
124
- if (index == -1)
125
- throw new InvalidOperationException_1.default(`The type ${cT.name} is not inside the Join list`);
126
- }
127
- }
128
- exports.JoiningQuery = JoiningQuery;
129
- class JoinSelectable {
130
- constructor(cT, context, stack, onStack) {
131
- this._stack = [];
132
- this._onStatements = [];
133
- this._firstOrDefault = false;
134
- this._type = cT;
135
- this._context = context;
136
- this._stack = stack;
137
- this._onStatements = onStack;
138
- }
139
- Join(key) {
140
- var _a;
141
- (_a = this._context.Collection(this._type)) === null || _a === void 0 ? void 0 : _a.Join(key);
142
- return this;
143
- }
144
- OrderBy(key) {
145
- var _a;
146
- (_a = this._context.Collection(this._type)) === null || _a === void 0 ? void 0 : _a.OrderBy(key);
147
- return this;
148
- }
149
- OrderDescendingBy(key) {
150
- var _a;
151
- (_a = this._context.Collection(this._type)) === null || _a === void 0 ? void 0 : _a.OrderDescendingBy(key);
152
- return this;
153
- }
154
- ToListAsync() {
155
- return __awaiter(this, void 0, void 0, function* () {
156
- if (this._stack.length > this._onStatements.length + 1)
157
- throw new InvalidOperationException_1.default(`There is no enought On clausules to join all selected types`);
158
- if (this._stack.length < this._onStatements.length + 1)
159
- throw new InvalidOperationException_1.default(`There is more On clausules than join types selecteds`);
160
- let selectedSideSet = this._context.Collection(this._type);
161
- let leftSideType = this._stack[0].Type;
162
- let selectedTable = Type_1.default.GetTableName(this._type);
163
- let query = `select distinct "${selectedTable}".* from "${Type_1.default.GetTableName(leftSideType)}" `;
164
- for (let i = 1; i < this._stack.length; i++) {
165
- let rightSideType = this._stack[i].Type;
166
- let leftSideTable = Type_1.default.GetTableName(leftSideType);
167
- let rigthSideTable = Type_1.default.GetTableName(rightSideType);
168
- let onStatement = this._onStatements[i - 1];
169
- let leftSideField = onStatement[0];
170
- let rightSideField = onStatement[1];
171
- let leftSideIsArray = Type_1.default.GetDesingType(leftSideType, leftSideField) == Array;
172
- let rightSideIsArray = Type_1.default.GetDesingType(rightSideType, rightSideField) == Array;
173
- let rightSideTypeMap = Type_1.default.GetColumnNameAndType(rightSideType);
174
- let leftSideTypeMap = Type_1.default.GetColumnNameAndType(leftSideType);
175
- query += ` inner join "${rigthSideTable}" on `;
176
- if ((leftSideIsArray && rightSideIsArray) || (!leftSideIsArray && !rightSideIsArray)) {
177
- query += ` "${leftSideTable}".${Type_1.default.GetColumnName(leftSideType, leftSideField)} = "${rigthSideTable}".${Type_1.default.GetColumnName(rightSideType, rightSideField)} `;
178
- }
179
- else if (leftSideIsArray && !rightSideIsArray) {
180
- let relation = SchemasDecorators_1.default.GetRelationAttribute(leftSideType, leftSideField);
181
- if (relation) {
182
- let rType = relation.TypeBuilder();
183
- let key = SchemasDecorators_1.default.ExtractPrimaryKey(rType);
184
- if (!key)
185
- throw new ConstraintFailException_1.default(`The type ${rType.name} was no one primary key field`);
186
- let relationMap = Type_1.default.GetColumnNameAndType(rType);
187
- let leftSideDBType = Type_1.default.CastType(relationMap.filter(s => s.Field == key)[0].Type);
188
- let rightSideDBType = Type_1.default.CastType(rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Type);
189
- let leftColumnName = leftSideTypeMap.filter(s => s.Field == leftSideField)[0].Column;
190
- let rightColumnName = rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Column;
191
- if (leftSideDBType != rightSideDBType) {
192
- throw new InvalidOperationException_1.default(`${leftSideType.name}.${leftSideField} and ${rightSideType.name}.${rightSideField} must be the same type to join`);
193
- }
194
- query += ` "${rigthSideTable}".${rightColumnName} = ANY("${leftSideTable}".${leftColumnName})`;
195
- }
196
- else {
197
- let dataType = SchemasDecorators_1.default.GetDataTypeAttribute(leftSideType, leftSideField);
198
- if (!dataType) {
199
- throw new InvalidOperationException_1.default(`Can not find the DataAttributeof ${leftSideType.name}.${leftSideField}`);
200
- }
201
- let elementType = Type_1.default.ExtractElementType(dataType);
202
- if (!elementType)
203
- throw new InvalidOperationException_1.default(`Can not determine the array element type of ${leftSideType.name}.${leftSideField}`);
204
- let leftColumnName = leftSideTypeMap.filter(s => s.Field == leftSideField)[0].Column;
205
- let rightSideDBType = Type_1.default.CastType(rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Type);
206
- let rightColumnName = rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Column;
207
- let areNumbers = Type_1.default.IsNumber(Type_1.default.CastType(elementType)) && Type_1.default.IsNumber(rightSideDBType);
208
- let areString = Type_1.default.IsText(Type_1.default.CastType(elementType)) && Type_1.default.IsText(rightSideDBType);
209
- let areDate = Type_1.default.IsDate(Type_1.default.CastType(elementType)) && Type_1.default.IsDate(rightSideDBType);
210
- let areArray = Type_1.default.IsArray(Type_1.default.CastType(elementType)) && Type_1.default.IsArray(rightSideDBType);
211
- let areSameType = this._context["_manager"]["CastToPostgreSQLType"](elementType) == this._context["_manager"]["CastToPostgreSQLType"](rightSideDBType);
212
- let areSerial = this._context["_manager"]["CastToPostgreSQLType"](elementType) == "serial" && this._context["_manager"]["CastToPostgreSQLType"](rightSideDBType) == "serial";
213
- if (!(areNumbers || areString || areDate || areArray || areSameType || areSerial))
214
- throw new InvalidOperationException_1.default(`${leftSideType.name}.${leftSideField} and ${rightSideType.name}.${rightSideField} must be the same type to join`);
215
- query += ` "${rigthSideTable}".${rightColumnName} = ANY("${leftSideTable}".${leftColumnName})`;
216
- }
217
- }
218
- else if (rightSideIsArray && !leftSideIsArray) {
219
- let relation = SchemasDecorators_1.default.GetRelationAttribute(rightSideType, rightSideField);
220
- if (relation) {
221
- let rType = relation.TypeBuilder();
222
- let key = SchemasDecorators_1.default.ExtractPrimaryKey(rType);
223
- if (!key)
224
- throw new ConstraintFailException_1.default(`The type ${rType.name} was no one primary key field`);
225
- let relationMap = Type_1.default.GetColumnNameAndType(rType);
226
- let rightSideDBType = Type_1.default.CastType(relationMap.filter(s => s.Field == key)[0].Type);
227
- let leftSideDBType = Type_1.default.CastType(rightSideTypeMap.filter(s => s.Field == leftSideField)[0].Type);
228
- let leftColumnName = leftSideTypeMap.filter(s => s.Field == leftSideField)[0].Column;
229
- let rightColumnName = rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Column;
230
- if (leftSideDBType != rightSideDBType) {
231
- throw new InvalidOperationException_1.default(`${leftSideType.name}.${leftSideField} and ${rightSideType.name}.${rightSideField} must be the same type to join`);
232
- }
233
- query += ` "${leftSideTable}".${leftColumnName} = ANY("${rigthSideTable}".${rightColumnName})`;
234
- }
235
- else {
236
- let dataType = SchemasDecorators_1.default.GetDataTypeAttribute(rightSideType, rightSideField);
237
- if (!dataType) {
238
- throw new InvalidOperationException_1.default(`Can not find the DataAttributeof ${rightSideType.name}.${rightSideField}`);
239
- }
240
- let elementType = Type_1.default.ExtractElementType(dataType);
241
- if (!elementType)
242
- throw new InvalidOperationException_1.default(`Can not determine the array element type of ${rightSideType.name}.${rightSideField}`);
243
- let leftColumnName = leftSideTypeMap.filter(s => s.Field == leftSideField)[0].Column;
244
- let leftSideDBType = Type_1.default.CastType(leftSideTypeMap.filter(s => s.Field == leftSideField)[0].Type);
245
- let rightColumnName = rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Column;
246
- let areNumbers = Type_1.default.IsNumber(Type_1.default.CastType(elementType)) && Type_1.default.IsNumber(leftSideDBType);
247
- let areString = Type_1.default.IsText(Type_1.default.CastType(elementType)) && Type_1.default.IsText(leftSideDBType);
248
- let areDate = Type_1.default.IsDate(Type_1.default.CastType(elementType)) && Type_1.default.IsDate(leftSideDBType);
249
- let areArray = Type_1.default.IsArray(Type_1.default.CastType(elementType)) && Type_1.default.IsArray(leftSideDBType);
250
- let areSameType = this._context["_manager"]["CastToPostgreSQLType"](elementType) == this._context["_manager"]["CastToPostgreSQLType"](leftSideDBType);
251
- let areSerial = this._context["_manager"]["CastToPostgreSQLType"](elementType) == "serial" && this._context["_manager"]["CastToPostgreSQLType"](leftSideDBType) == "serial";
252
- if (!(areNumbers || areString || areDate || areArray || areSameType || areSerial))
253
- throw new InvalidOperationException_1.default(`${leftSideType.name}.${leftSideField} and ${rightSideType.name}.${rightSideField} must be the same type to join`);
254
- query += ` "${leftSideTable}".${leftColumnName} = ANY("${rigthSideTable}".${rightColumnName})`;
255
- }
256
- }
257
- leftSideType = this._stack[i].Type;
258
- }
259
- let where = "";
260
- for (let type of this._stack) {
261
- let set = this._context.Collection(type.Type);
262
- let statements = set["_statements"];
263
- for (let s of statements) {
264
- let operation = s.StatementType.toString();
265
- if (operation == "where" && where.length > 0)
266
- operation = "and";
267
- where += ` ${operation} ${set["EvaluateStatement"](s)}`;
268
- }
269
- }
270
- PGSetHelper_1.default.InjectSQL(selectedSideSet, query);
271
- PGSetHelper_1.default.InjectWhere(selectedSideSet, where);
272
- if (this._firstOrDefault)
273
- selectedSideSet.Limit(1);
274
- return yield selectedSideSet.ToListAsync();
275
- });
276
- }
277
- FirstOrDefaultAsync() {
278
- return __awaiter(this, void 0, void 0, function* () {
279
- this._firstOrDefault = true;
280
- let d = yield this.ToListAsync();
281
- this.Reset();
282
- if (d.length > 0)
283
- return d[0];
284
- return undefined;
285
- });
286
- }
287
- Reset() {
288
- for (let i = 1; i < this._stack.length; i++) {
289
- let type = this._stack[i].Type;
290
- let set = this._context.Collection(type);
291
- set["Reset"]();
292
- }
293
- this._stack = [];
294
- this._firstOrDefault = false;
295
- this._onStatements = [];
296
- }
297
- }
298
- exports.JoinSelectable = JoinSelectable;
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.JoinSelectable = exports.JoiningQuery = void 0;
16
+ const SchemasDecorators_1 = __importDefault(require("../core/decorators/SchemasDecorators"));
17
+ const Type_1 = __importDefault(require("../core/design/Type"));
18
+ const ConstraintFailException_1 = __importDefault(require("../core/exceptions/ConstraintFailException"));
19
+ const InvalidOperationException_1 = __importDefault(require("../core/exceptions/InvalidOperationException"));
20
+ const PGDBSet_1 = __importDefault(require("./PGDBSet"));
21
+ const PGSetHelper_1 = __importDefault(require("./PGSetHelper"));
22
+ class PGDBContext {
23
+ constructor(manager) {
24
+ this._manager = manager;
25
+ }
26
+ GetMappedTypes() {
27
+ if (this._mappedTypes != undefined)
28
+ return this._mappedTypes;
29
+ this._mappedTypes = [];
30
+ let props = Object.keys(this);
31
+ for (let prop of props) {
32
+ if (this[prop].constructor == PGDBSet_1.default) {
33
+ this._mappedTypes.push(this[prop]["_type"]);
34
+ }
35
+ }
36
+ return this._mappedTypes;
37
+ }
38
+ IsMapped(type) {
39
+ return this.GetMappedTypes().filter(t => t == type).length > 0;
40
+ }
41
+ Collection(cTor) {
42
+ for (let prop of Object.keys(this)) {
43
+ let type = this[prop]["_type"];
44
+ if (type == undefined)
45
+ continue;
46
+ if (type == cTor)
47
+ return this[prop];
48
+ }
49
+ return undefined;
50
+ }
51
+ UpdateDatabaseAsync() {
52
+ return __awaiter(this, void 0, void 0, function* () {
53
+ let dbName = this._manager["_connection"].DataBaseName;
54
+ if (!(yield this._manager.CheckDatabase(dbName)))
55
+ yield this._manager.CreateDataBase(dbName);
56
+ for (let type of this.GetMappedTypes()) {
57
+ yield this._manager.UpdateDatabaseForEntity(type);
58
+ }
59
+ });
60
+ }
61
+ ExecuteNonQuery(query) {
62
+ return __awaiter(this, void 0, void 0, function* () {
63
+ yield this._manager.ExecuteNonQuery(query);
64
+ });
65
+ }
66
+ ExecuteQuery(query) {
67
+ return __awaiter(this, void 0, void 0, function* () {
68
+ return yield this._manager.Execute(query);
69
+ });
70
+ }
71
+ Join(...args) {
72
+ return new JoiningQuery(this, args);
73
+ }
74
+ }
75
+ exports.default = PGDBContext;
76
+ class JoiningQuery {
77
+ constructor(context, stack) {
78
+ this._stack = [];
79
+ this._onStatements = [];
80
+ this._context = context;
81
+ this._stack.push(...stack.map(s => { return { Type: s }; }));
82
+ let notMappedTypes = this._stack.filter(s => this._context.Collection(s.Type) == undefined);
83
+ if (notMappedTypes.length > 0) {
84
+ this._stack = [];
85
+ throw new InvalidOperationException_1.default(`The type ${notMappedTypes[0].Type.name} is not mapped`);
86
+ }
87
+ }
88
+ On(cT, cKey, uT, uKey) {
89
+ this.CheckIfTypeIsAllowed(cT);
90
+ this.CheckIfTypeIsAllowed(cT);
91
+ let leftIndex = this._stack.findIndex(s => s.Type == cT);
92
+ let rightIndex = this._stack.findIndex(s => s.Type == uT);
93
+ if (rightIndex - leftIndex != 1)
94
+ throw new InvalidOperationException_1.default(`The On statement must follow the same order than Join`);
95
+ this._onStatements.push([cKey.toString(), uKey.toString()]);
96
+ return this;
97
+ }
98
+ Where(cT, statement) {
99
+ this.CheckIfTypeIsAllowed(cT);
100
+ let set = this._context.Collection(cT);
101
+ set.Where(statement);
102
+ return this;
103
+ }
104
+ And(cT, statement) {
105
+ this.CheckIfTypeIsAllowed(cT);
106
+ let set = this._context.Collection(cT);
107
+ set.And(statement);
108
+ return this;
109
+ }
110
+ Or(cT, statement) {
111
+ this.CheckIfTypeIsAllowed(cT);
112
+ let set = this._context.Collection(cT);
113
+ set.Or(statement);
114
+ return this;
115
+ }
116
+ Select(cT) {
117
+ return new JoinSelectable(cT, this._context, this._stack, this._onStatements);
118
+ }
119
+ CheckIfTypeIsAllowed(cT) {
120
+ let set = this._context.Collection(cT);
121
+ if (!set)
122
+ throw new InvalidOperationException_1.default(`The type ${cT.name} is not mapped`);
123
+ let index = this._stack.findIndex(s => s.Type == cT);
124
+ if (index == -1)
125
+ throw new InvalidOperationException_1.default(`The type ${cT.name} is not inside the Join list`);
126
+ }
127
+ }
128
+ exports.JoiningQuery = JoiningQuery;
129
+ class JoinSelectable {
130
+ constructor(cT, context, stack, onStack) {
131
+ this._stack = [];
132
+ this._onStatements = [];
133
+ this._firstOrDefault = false;
134
+ this._type = cT;
135
+ this._context = context;
136
+ this._stack = stack;
137
+ this._onStatements = onStack;
138
+ }
139
+ Join(key) {
140
+ var _a;
141
+ (_a = this._context.Collection(this._type)) === null || _a === void 0 ? void 0 : _a.Join(key);
142
+ return this;
143
+ }
144
+ OrderBy(key) {
145
+ var _a;
146
+ (_a = this._context.Collection(this._type)) === null || _a === void 0 ? void 0 : _a.OrderBy(key);
147
+ return this;
148
+ }
149
+ OrderDescendingBy(key) {
150
+ var _a;
151
+ (_a = this._context.Collection(this._type)) === null || _a === void 0 ? void 0 : _a.OrderDescendingBy(key);
152
+ return this;
153
+ }
154
+ ToListAsync() {
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ if (this._stack.length > this._onStatements.length + 1)
157
+ throw new InvalidOperationException_1.default(`There is no enought On clausules to join all selected types`);
158
+ if (this._stack.length < this._onStatements.length + 1)
159
+ throw new InvalidOperationException_1.default(`There is more On clausules than join types selecteds`);
160
+ let selectedSideSet = this._context.Collection(this._type);
161
+ let leftSideType = this._stack[0].Type;
162
+ let selectedTable = Type_1.default.GetTableName(this._type);
163
+ let query = `select distinct "${selectedTable}".* from "${Type_1.default.GetTableName(leftSideType)}" `;
164
+ for (let i = 1; i < this._stack.length; i++) {
165
+ let rightSideType = this._stack[i].Type;
166
+ let leftSideTable = Type_1.default.GetTableName(leftSideType);
167
+ let rigthSideTable = Type_1.default.GetTableName(rightSideType);
168
+ let onStatement = this._onStatements[i - 1];
169
+ let leftSideField = onStatement[0];
170
+ let rightSideField = onStatement[1];
171
+ let leftSideIsArray = Type_1.default.GetDesingType(leftSideType, leftSideField) == Array;
172
+ let rightSideIsArray = Type_1.default.GetDesingType(rightSideType, rightSideField) == Array;
173
+ let rightSideTypeMap = Type_1.default.GetColumnNameAndType(rightSideType);
174
+ let leftSideTypeMap = Type_1.default.GetColumnNameAndType(leftSideType);
175
+ query += ` inner join "${rigthSideTable}" on `;
176
+ if ((leftSideIsArray && rightSideIsArray) || (!leftSideIsArray && !rightSideIsArray)) {
177
+ query += ` "${leftSideTable}".${Type_1.default.GetColumnName(leftSideType, leftSideField)} = "${rigthSideTable}".${Type_1.default.GetColumnName(rightSideType, rightSideField)} `;
178
+ }
179
+ else if (leftSideIsArray && !rightSideIsArray) {
180
+ let relation = SchemasDecorators_1.default.GetRelationAttribute(leftSideType, leftSideField);
181
+ if (relation) {
182
+ let rType = relation.TypeBuilder();
183
+ let key = SchemasDecorators_1.default.ExtractPrimaryKey(rType);
184
+ if (!key)
185
+ throw new ConstraintFailException_1.default(`The type ${rType.name} was no one primary key field`);
186
+ let relationMap = Type_1.default.GetColumnNameAndType(rType);
187
+ let leftSideDBType = Type_1.default.CastType(relationMap.filter(s => s.Field == key)[0].Type);
188
+ let rightSideDBType = Type_1.default.CastType(rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Type);
189
+ let leftColumnName = leftSideTypeMap.filter(s => s.Field == leftSideField)[0].Column;
190
+ let rightColumnName = rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Column;
191
+ if (leftSideDBType != rightSideDBType) {
192
+ throw new InvalidOperationException_1.default(`${leftSideType.name}.${leftSideField} and ${rightSideType.name}.${rightSideField} must be the same type to join`);
193
+ }
194
+ query += ` "${rigthSideTable}".${rightColumnName} = ANY("${leftSideTable}".${leftColumnName})`;
195
+ }
196
+ else {
197
+ let dataType = SchemasDecorators_1.default.GetDataTypeAttribute(leftSideType, leftSideField);
198
+ if (!dataType) {
199
+ throw new InvalidOperationException_1.default(`Can not find the DataAttributeof ${leftSideType.name}.${leftSideField}`);
200
+ }
201
+ let elementType = Type_1.default.ExtractElementType(dataType);
202
+ if (!elementType)
203
+ throw new InvalidOperationException_1.default(`Can not determine the array element type of ${leftSideType.name}.${leftSideField}`);
204
+ let leftColumnName = leftSideTypeMap.filter(s => s.Field == leftSideField)[0].Column;
205
+ let rightSideDBType = Type_1.default.CastType(rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Type);
206
+ let rightColumnName = rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Column;
207
+ let areNumbers = Type_1.default.IsNumber(Type_1.default.CastType(elementType)) && Type_1.default.IsNumber(rightSideDBType);
208
+ let areString = Type_1.default.IsText(Type_1.default.CastType(elementType)) && Type_1.default.IsText(rightSideDBType);
209
+ let areDate = Type_1.default.IsDate(Type_1.default.CastType(elementType)) && Type_1.default.IsDate(rightSideDBType);
210
+ let areArray = Type_1.default.IsArray(Type_1.default.CastType(elementType)) && Type_1.default.IsArray(rightSideDBType);
211
+ let areSameType = this._context["_manager"]["CastToPostgreSQLType"](elementType) == this._context["_manager"]["CastToPostgreSQLType"](rightSideDBType);
212
+ let areSerial = this._context["_manager"]["CastToPostgreSQLType"](elementType) == "serial" && this._context["_manager"]["CastToPostgreSQLType"](rightSideDBType) == "serial";
213
+ if (!(areNumbers || areString || areDate || areArray || areSameType || areSerial))
214
+ throw new InvalidOperationException_1.default(`${leftSideType.name}.${leftSideField} and ${rightSideType.name}.${rightSideField} must be the same type to join`);
215
+ query += ` "${rigthSideTable}".${rightColumnName} = ANY("${leftSideTable}".${leftColumnName})`;
216
+ }
217
+ }
218
+ else if (rightSideIsArray && !leftSideIsArray) {
219
+ let relation = SchemasDecorators_1.default.GetRelationAttribute(rightSideType, rightSideField);
220
+ if (relation) {
221
+ let rType = relation.TypeBuilder();
222
+ let key = SchemasDecorators_1.default.ExtractPrimaryKey(rType);
223
+ if (!key)
224
+ throw new ConstraintFailException_1.default(`The type ${rType.name} was no one primary key field`);
225
+ let relationMap = Type_1.default.GetColumnNameAndType(rType);
226
+ let rightSideDBType = Type_1.default.CastType(relationMap.filter(s => s.Field == key)[0].Type);
227
+ let leftSideDBType = Type_1.default.CastType(rightSideTypeMap.filter(s => s.Field == leftSideField)[0].Type);
228
+ let leftColumnName = leftSideTypeMap.filter(s => s.Field == leftSideField)[0].Column;
229
+ let rightColumnName = rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Column;
230
+ if (leftSideDBType != rightSideDBType) {
231
+ throw new InvalidOperationException_1.default(`${leftSideType.name}.${leftSideField} and ${rightSideType.name}.${rightSideField} must be the same type to join`);
232
+ }
233
+ query += ` "${leftSideTable}".${leftColumnName} = ANY("${rigthSideTable}".${rightColumnName})`;
234
+ }
235
+ else {
236
+ let dataType = SchemasDecorators_1.default.GetDataTypeAttribute(rightSideType, rightSideField);
237
+ if (!dataType) {
238
+ throw new InvalidOperationException_1.default(`Can not find the DataAttributeof ${rightSideType.name}.${rightSideField}`);
239
+ }
240
+ let elementType = Type_1.default.ExtractElementType(dataType);
241
+ if (!elementType)
242
+ throw new InvalidOperationException_1.default(`Can not determine the array element type of ${rightSideType.name}.${rightSideField}`);
243
+ let leftColumnName = leftSideTypeMap.filter(s => s.Field == leftSideField)[0].Column;
244
+ let leftSideDBType = Type_1.default.CastType(leftSideTypeMap.filter(s => s.Field == leftSideField)[0].Type);
245
+ let rightColumnName = rightSideTypeMap.filter(s => s.Field == rightSideField)[0].Column;
246
+ let areNumbers = Type_1.default.IsNumber(Type_1.default.CastType(elementType)) && Type_1.default.IsNumber(leftSideDBType);
247
+ let areString = Type_1.default.IsText(Type_1.default.CastType(elementType)) && Type_1.default.IsText(leftSideDBType);
248
+ let areDate = Type_1.default.IsDate(Type_1.default.CastType(elementType)) && Type_1.default.IsDate(leftSideDBType);
249
+ let areArray = Type_1.default.IsArray(Type_1.default.CastType(elementType)) && Type_1.default.IsArray(leftSideDBType);
250
+ let areSameType = this._context["_manager"]["CastToPostgreSQLType"](elementType) == this._context["_manager"]["CastToPostgreSQLType"](leftSideDBType);
251
+ let areSerial = this._context["_manager"]["CastToPostgreSQLType"](elementType) == "serial" && this._context["_manager"]["CastToPostgreSQLType"](leftSideDBType) == "serial";
252
+ if (!(areNumbers || areString || areDate || areArray || areSameType || areSerial))
253
+ throw new InvalidOperationException_1.default(`${leftSideType.name}.${leftSideField} and ${rightSideType.name}.${rightSideField} must be the same type to join`);
254
+ query += ` "${leftSideTable}".${leftColumnName} = ANY("${rigthSideTable}".${rightColumnName})`;
255
+ }
256
+ }
257
+ leftSideType = this._stack[i].Type;
258
+ }
259
+ let where = "";
260
+ for (let type of this._stack) {
261
+ let set = this._context.Collection(type.Type);
262
+ let statements = set["_statements"];
263
+ for (let s of statements) {
264
+ let operation = s.StatementType.toString();
265
+ if (operation == "where" && where.length > 0)
266
+ operation = "and";
267
+ where += ` ${operation} ${set["EvaluateStatement"](s)}`;
268
+ }
269
+ }
270
+ PGSetHelper_1.default.InjectSQL(selectedSideSet, query);
271
+ PGSetHelper_1.default.InjectWhere(selectedSideSet, where);
272
+ if (this._firstOrDefault)
273
+ selectedSideSet.Limit(1);
274
+ return yield selectedSideSet.ToListAsync();
275
+ });
276
+ }
277
+ FirstOrDefaultAsync() {
278
+ return __awaiter(this, void 0, void 0, function* () {
279
+ this._firstOrDefault = true;
280
+ let d = yield this.ToListAsync();
281
+ this.Reset();
282
+ if (d.length > 0)
283
+ return d[0];
284
+ return undefined;
285
+ });
286
+ }
287
+ Reset() {
288
+ for (let i = 1; i < this._stack.length; i++) {
289
+ let type = this._stack[i].Type;
290
+ let set = this._context.Collection(type);
291
+ set["Reset"]();
292
+ }
293
+ this._stack = [];
294
+ this._firstOrDefault = false;
295
+ this._onStatements = [];
296
+ }
297
+ }
298
+ exports.JoinSelectable = JoinSelectable;
299
299
  //# sourceMappingURL=PGDBContext.js.map