myorm_pg 6.1.4 → 6.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/core/design/Type.d.ts.map +1 -1
- package/lib/core/design/Type.js +1 -0
- package/lib/core/design/Type.js.map +1 -1
- package/lib/implementations/PGDBContext.d.ts +5 -1
- package/lib/implementations/PGDBContext.d.ts.map +1 -1
- package/lib/implementations/PGDBContext.js +159 -118
- package/lib/implementations/PGDBContext.js.map +1 -1
- package/lib/implementations/PGDBManager.d.ts.map +1 -1
- package/lib/implementations/PGDBManager.js +2 -0
- package/lib/implementations/PGDBManager.js.map +1 -1
- package/lib/implementations/PGDBSet.d.ts +3 -1
- package/lib/implementations/PGDBSet.d.ts.map +1 -1
- package/lib/implementations/PGDBSet.js +280 -66
- package/lib/implementations/PGDBSet.js.map +1 -1
- package/package.json +2 -2
- package/lib/__tests__/classes/RawTypes.d.ts +0 -3
- package/lib/__tests__/classes/RawTypes.d.ts.map +0 -1
- package/lib/__tests__/classes/RawTypes.js +0 -16
- package/lib/__tests__/classes/RawTypes.js.map +0 -1
- package/lib/__tests__/classes/RelationEntity.d.ts +0 -12
- package/lib/__tests__/classes/RelationEntity.d.ts.map +0 -1
- package/lib/__tests__/classes/RelationEntity.js +0 -65
- package/lib/__tests__/classes/RelationEntity.js.map +0 -1
- package/lib/__tests__/classes/TestContext.d.ts +0 -9
- package/lib/__tests__/classes/TestContext.d.ts.map +0 -1
- package/lib/__tests__/classes/TestContext.js +0 -14
- package/lib/__tests__/classes/TestContext.js.map +0 -1
- package/lib/__tests__/classes/TestEntity.d.ts +0 -18
- package/lib/__tests__/classes/TestEntity.d.ts.map +0 -1
- package/lib/__tests__/classes/TestEntity.js +0 -99
- package/lib/__tests__/classes/TestEntity.js.map +0 -1
- package/lib/__tests__/functions/TestFunctions.d.ts +0 -11
- package/lib/__tests__/functions/TestFunctions.d.ts.map +0 -1
- package/lib/__tests__/functions/TestFunctions.js +0 -137
- package/lib/__tests__/functions/TestFunctions.js.map +0 -1
- package/lib/src/Index.d.ts +0 -41
- package/lib/src/Index.d.ts.map +0 -1
- package/lib/src/Index.js +0 -64
- package/lib/src/Index.js.map +0 -1
- package/lib/src/core/decorators/SchemasDecorators.d.ts +0 -45
- package/lib/src/core/decorators/SchemasDecorators.d.ts.map +0 -1
- package/lib/src/core/decorators/SchemasDecorators.js +0 -145
- package/lib/src/core/decorators/SchemasDecorators.js.map +0 -1
- package/lib/src/core/design/Type.d.ts +0 -39
- package/lib/src/core/design/Type.d.ts.map +0 -1
- package/lib/src/core/design/Type.js +0 -144
- package/lib/src/core/design/Type.js.map +0 -1
- package/lib/src/core/enums/DBTypes.d.ts +0 -19
- package/lib/src/core/enums/DBTypes.d.ts.map +0 -1
- package/lib/src/core/enums/DBTypes.js +0 -23
- package/lib/src/core/enums/DBTypes.js.map +0 -1
- package/lib/src/core/enums/RelationType.d.ts +0 -7
- package/lib/src/core/enums/RelationType.d.ts.map +0 -1
- package/lib/src/core/enums/RelationType.js +0 -11
- package/lib/src/core/enums/RelationType.js.map +0 -1
- package/lib/src/core/exceptions/ConnectionFailException.d.ts +0 -5
- package/lib/src/core/exceptions/ConnectionFailException.d.ts.map +0 -1
- package/lib/src/core/exceptions/ConnectionFailException.js +0 -13
- package/lib/src/core/exceptions/ConnectionFailException.js.map +0 -1
- package/lib/src/core/exceptions/ConstraintFailException.d.ts +0 -5
- package/lib/src/core/exceptions/ConstraintFailException.d.ts.map +0 -1
- package/lib/src/core/exceptions/ConstraintFailException.js +0 -13
- package/lib/src/core/exceptions/ConstraintFailException.js.map +0 -1
- package/lib/src/core/exceptions/Exception.d.ts +0 -5
- package/lib/src/core/exceptions/Exception.d.ts.map +0 -1
- package/lib/src/core/exceptions/Exception.js +0 -10
- package/lib/src/core/exceptions/Exception.js.map +0 -1
- package/lib/src/core/exceptions/InvalidOperationException.d.ts +0 -6
- package/lib/src/core/exceptions/InvalidOperationException.d.ts.map +0 -1
- package/lib/src/core/exceptions/InvalidOperationException.js +0 -14
- package/lib/src/core/exceptions/InvalidOperationException.js.map +0 -1
- package/lib/src/core/exceptions/NotImplementedException.d.ts +0 -5
- package/lib/src/core/exceptions/NotImplementedException.d.ts.map +0 -1
- package/lib/src/core/exceptions/NotImplementedException.js +0 -13
- package/lib/src/core/exceptions/NotImplementedException.js.map +0 -1
- package/lib/src/core/exceptions/QueryFailException.d.ts +0 -6
- package/lib/src/core/exceptions/QueryFailException.d.ts.map +0 -1
- package/lib/src/core/exceptions/QueryFailException.js +0 -14
- package/lib/src/core/exceptions/QueryFailException.js.map +0 -1
- package/lib/src/core/exceptions/TypeNotMappedException.d.ts +0 -5
- package/lib/src/core/exceptions/TypeNotMappedException.d.ts.map +0 -1
- package/lib/src/core/exceptions/TypeNotMappedException.js +0 -13
- package/lib/src/core/exceptions/TypeNotMappedException.js.map +0 -1
- package/lib/src/core/exceptions/TypeNotSuportedException.d.ts +0 -5
- package/lib/src/core/exceptions/TypeNotSuportedException.d.ts.map +0 -1
- package/lib/src/core/exceptions/TypeNotSuportedException.js +0 -13
- package/lib/src/core/exceptions/TypeNotSuportedException.js.map +0 -1
- package/lib/src/core/handlers/DBOperationLogHandler.d.ts +0 -17
- package/lib/src/core/handlers/DBOperationLogHandler.d.ts.map +0 -1
- package/lib/src/core/handlers/DBOperationLogHandler.js +0 -18
- package/lib/src/core/handlers/DBOperationLogHandler.js.map +0 -1
- package/lib/src/implementations/PGDBConnection.d.ts +0 -19
- package/lib/src/implementations/PGDBConnection.d.ts.map +0 -1
- package/lib/src/implementations/PGDBConnection.js +0 -105
- package/lib/src/implementations/PGDBConnection.js.map +0 -1
- package/lib/src/implementations/PGDBContext.d.ts +0 -54
- package/lib/src/implementations/PGDBContext.d.ts.map +0 -1
- package/lib/src/implementations/PGDBContext.js +0 -302
- package/lib/src/implementations/PGDBContext.js.map +0 -1
- package/lib/src/implementations/PGDBManager.d.ts +0 -37
- package/lib/src/implementations/PGDBManager.d.ts.map +0 -1
- package/lib/src/implementations/PGDBManager.js +0 -296
- package/lib/src/implementations/PGDBManager.js.map +0 -1
- package/lib/src/implementations/PGDBSet.d.ts +0 -60
- package/lib/src/implementations/PGDBSet.d.ts.map +0 -1
- package/lib/src/implementations/PGDBSet.js +0 -1385
- package/lib/src/implementations/PGDBSet.js.map +0 -1
- package/lib/src/implementations/PGFluentField.d.ts +0 -18
- package/lib/src/implementations/PGFluentField.d.ts.map +0 -1
- package/lib/src/implementations/PGFluentField.js +0 -155
- package/lib/src/implementations/PGFluentField.js.map +0 -1
- package/lib/src/implementations/PGSetHelper.d.ts +0 -19
- package/lib/src/implementations/PGSetHelper.d.ts.map +0 -1
- package/lib/src/implementations/PGSetHelper.js +0 -48
- package/lib/src/implementations/PGSetHelper.js.map +0 -1
|
@@ -44,9 +44,10 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
44
44
|
AddAsync(obj) {
|
|
45
45
|
return this.AddObjectAsync(obj);
|
|
46
46
|
}
|
|
47
|
-
AddObjectAsync(obj, cascade = true, relations = []) {
|
|
47
|
+
AddObjectAsync(obj, cascade = true, relations = [], visiteds = []) {
|
|
48
48
|
return this.CreatePromisse(() => __awaiter(this, void 0, void 0, function* () {
|
|
49
|
-
var _a, _b;
|
|
49
|
+
var _a, _b, _c;
|
|
50
|
+
visiteds = visiteds !== null && visiteds !== void 0 ? visiteds : [];
|
|
50
51
|
if (!obj)
|
|
51
52
|
throw new InvalidOperationException_1.default(`Cannot insert a null reference object of ${this._type.name}`);
|
|
52
53
|
if (!this.IsCorrectType(obj))
|
|
@@ -88,6 +89,9 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
88
89
|
}
|
|
89
90
|
if (key == undefined)
|
|
90
91
|
throw new InvalidOperationException_1.default(`The type ${this._type.name} must have a primary key field`);
|
|
92
|
+
if (visiteds.filter(s => s && s.constructor == obj.constructor && Reflect.get(s, key.Property) == Reflect.get(obj, key.Property)).length > 0)
|
|
93
|
+
return obj;
|
|
94
|
+
visiteds.push(obj);
|
|
91
95
|
if (Type_1.default.HasValue(Reflect.get(obj, key.Property)))
|
|
92
96
|
throw new InvalidOperationException_1.default(`Can not add a ${this._type.name} with ${key.Property} provided`);
|
|
93
97
|
sql = sql.substring(0, sql.length - 1) + ") ";
|
|
@@ -99,6 +103,9 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
99
103
|
}
|
|
100
104
|
let subTypesUpdates = [];
|
|
101
105
|
let updatableFields = [];
|
|
106
|
+
let objectsToUpdate = [];
|
|
107
|
+
let objectsToAdd = [];
|
|
108
|
+
let buildSubupdates = [];
|
|
102
109
|
for (let sub of subTypes) {
|
|
103
110
|
let relation = SchemasDecorators_1.default.GetRelationAttribute(this._type, sub.Field);
|
|
104
111
|
let subType = Type_1.default.GetDesingType(this._type, sub.Field);
|
|
@@ -126,11 +133,13 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
126
133
|
if (subRelation && subRelation.TypeBuilder() == this._type) {
|
|
127
134
|
if (subRelation.Field != undefined && subRelation.Field != sub.Field)
|
|
128
135
|
continue;
|
|
136
|
+
updatableFields.push(subKey);
|
|
129
137
|
if (subRelation.Relation == RelationType_1.RelationType.ONE_TO_MANY || subRelation.Relation == RelationType_1.RelationType.MANY_TO_MANY) {
|
|
130
|
-
updatableFields.push(subKey);
|
|
131
138
|
if (isArray) {
|
|
139
|
+
if (subObj == undefined || visiteds.indexOf(subObj) > -1)
|
|
140
|
+
continue;
|
|
132
141
|
for (let i of subObj) {
|
|
133
|
-
if (i == undefined)
|
|
142
|
+
if (i == undefined || visiteds.indexOf(i) > -1)
|
|
134
143
|
continue;
|
|
135
144
|
let metadata = Type_1.default.ExtractMetadata(i).filter(s => s.Field == subKey && s.Loaded);
|
|
136
145
|
let value = [];
|
|
@@ -147,6 +156,8 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
147
156
|
}
|
|
148
157
|
}
|
|
149
158
|
else {
|
|
159
|
+
if (subObj == undefined || visiteds.indexOf(subObj) > -1)
|
|
160
|
+
continue;
|
|
150
161
|
let metadata = Type_1.default.ExtractMetadata(subObj).filter(s => s.Field == subKey && s.Loaded);
|
|
151
162
|
let value = [];
|
|
152
163
|
if (metadata.length > 0) {
|
|
@@ -164,12 +175,14 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
164
175
|
else {
|
|
165
176
|
if (subRelation.Relation == RelationType_1.RelationType.MANY_TO_ONE && isArray) {
|
|
166
177
|
for (let i of subObj) {
|
|
167
|
-
if (i == undefined)
|
|
178
|
+
if (i == undefined || visiteds.indexOf(i) > -1)
|
|
168
179
|
continue;
|
|
169
180
|
Reflect.set(i, subKey, obj);
|
|
170
181
|
}
|
|
171
182
|
}
|
|
172
183
|
else {
|
|
184
|
+
if (subObj == undefined || visiteds.indexOf(subObj) > -1)
|
|
185
|
+
continue;
|
|
173
186
|
Reflect.set(subObj, subKey, obj);
|
|
174
187
|
}
|
|
175
188
|
}
|
|
@@ -177,43 +190,105 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
177
190
|
}
|
|
178
191
|
}
|
|
179
192
|
if (isArray) {
|
|
193
|
+
if (subObj == undefined)
|
|
194
|
+
continue;
|
|
180
195
|
for (let i of subObj) {
|
|
181
196
|
if (i == undefined)
|
|
182
197
|
continue;
|
|
183
198
|
if (!Type_1.default.HasValue(Reflect.get(i, subPK))) {
|
|
184
|
-
if (cascade || relations.filter(s => s == sub.Field))
|
|
185
|
-
|
|
199
|
+
if (cascade || relations.filter(s => s == sub.Field).length > 0) {
|
|
200
|
+
let cs = objectsToAdd.filter(s => s.Type == subType);
|
|
201
|
+
if (cs.length == 0)
|
|
202
|
+
objectsToAdd.push({ Objs: [i], Type: subType, SubPK: subPK });
|
|
203
|
+
else
|
|
204
|
+
cs[0].Objs.push(i);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
let cs = objectsToUpdate.filter(s => s.Type == subType);
|
|
209
|
+
if (cs.length == 0)
|
|
210
|
+
objectsToUpdate.push({ Objs: [{ Obj: i, UpdatableFields: updatableFields }], Type: subType, SubPK: subPK });
|
|
211
|
+
else {
|
|
212
|
+
let ccs = cs.filter(s => s.Objs.filter(j => j.Obj == i).length > 0);
|
|
213
|
+
if (ccs.length == 0) {
|
|
214
|
+
cs[0].Objs.push({ Obj: i, UpdatableFields: updatableFields });
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
ccs[0].Objs[0].UpdatableFields.push(...updatableFields);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
186
220
|
}
|
|
187
|
-
else
|
|
188
|
-
yield colletion["UpdateObjectAsync"](i, false, updatableFields);
|
|
189
221
|
}
|
|
190
222
|
}
|
|
191
223
|
else {
|
|
192
224
|
if (subObj == undefined)
|
|
193
225
|
continue;
|
|
194
226
|
if (!Type_1.default.HasValue(Reflect.get(subObj, subPK))) {
|
|
195
|
-
if (cascade || relations.filter(s => s == sub.Field))
|
|
196
|
-
|
|
227
|
+
if (cascade || relations.filter(s => s == sub.Field).length > 0) {
|
|
228
|
+
let cs = objectsToAdd.filter(s => s.Type == subType);
|
|
229
|
+
if (cs.length == 0)
|
|
230
|
+
objectsToAdd.push({ Objs: [subObj], Type: subType, SubPK: subPK });
|
|
231
|
+
else
|
|
232
|
+
cs[0].Objs.push(subObj);
|
|
233
|
+
}
|
|
197
234
|
}
|
|
198
|
-
else
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
continue;
|
|
212
|
-
updateValues.push(Reflect.get(i, subPK));
|
|
235
|
+
else {
|
|
236
|
+
let cs = objectsToUpdate.filter(s => s.Type == subType);
|
|
237
|
+
if (cs.length == 0)
|
|
238
|
+
objectsToUpdate.push({ Objs: [{ Obj: subObj, UpdatableFields: updatableFields }], Type: subType, SubPK: subPK });
|
|
239
|
+
else {
|
|
240
|
+
let ccs = cs.filter(s => s.Objs.filter(j => j.Obj == subObj).length > 0);
|
|
241
|
+
if (ccs.length == 0) {
|
|
242
|
+
cs[0].Objs.push({ Obj: subObj, UpdatableFields: updatableFields });
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
ccs[0].Objs[0].UpdatableFields.push(...updatableFields);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
213
248
|
}
|
|
214
249
|
}
|
|
215
|
-
|
|
250
|
+
buildSubupdates.push(() => {
|
|
251
|
+
let spk = SchemasDecorators_1.default.ExtractPrimaryKey(subType);
|
|
252
|
+
let columnType = Type_1.default.CastType(Type_1.default.GetDesingTimeTypeName(subType, spk));
|
|
253
|
+
if ((relation === null || relation === void 0 ? void 0 : relation.Relation) == RelationType_1.RelationType.MANY_TO_MANY || (relation === null || relation === void 0 ? void 0 : relation.Relation) == RelationType_1.RelationType.ONE_TO_MANY || isArray)
|
|
254
|
+
columnType = Type_1.default.AsArray(columnType);
|
|
255
|
+
if (subObj == undefined)
|
|
256
|
+
return;
|
|
257
|
+
let updateValues = [Reflect.get(subObj, spk)];
|
|
258
|
+
if (isArray) {
|
|
259
|
+
updateValues = [];
|
|
260
|
+
for (let i of subObj) {
|
|
261
|
+
if (i == undefined)
|
|
262
|
+
continue;
|
|
263
|
+
updateValues.push(Reflect.get(i, spk));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
Type_1.default.InjectMetadata(obj, {
|
|
267
|
+
Field: sub.Field,
|
|
268
|
+
Type: columnType,
|
|
269
|
+
Value: updateValues,
|
|
270
|
+
Loaded: true
|
|
271
|
+
});
|
|
272
|
+
subTypesUpdates.push(`"${sub.Column}" = ${this.CreateValueStatement(columnType, isArray ? updateValues : updateValues[0])}`);
|
|
273
|
+
});
|
|
216
274
|
}
|
|
275
|
+
objectsToAdd.forEach(o => {
|
|
276
|
+
o.Objs = o.Objs.filter((i, ix, s) => {
|
|
277
|
+
return ix == s.findIndex(v => v == i);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
for (let cs of objectsToAdd) {
|
|
281
|
+
let colletion = this._context.Collection(cs.Type);
|
|
282
|
+
for (let i of cs.Objs)
|
|
283
|
+
yield colletion["AddObjectAsync"](i, true, [], visiteds);
|
|
284
|
+
}
|
|
285
|
+
for (let cs of objectsToUpdate) {
|
|
286
|
+
let colletion = this._context.Collection(cs.Type);
|
|
287
|
+
for (let i of cs.Objs)
|
|
288
|
+
yield colletion["UpdateObjectAsync"](i.Obj, false, (_c = i.UpdatableFields) !== null && _c !== void 0 ? _c : [], [], visiteds);
|
|
289
|
+
}
|
|
290
|
+
for (let b of buildSubupdates)
|
|
291
|
+
b();
|
|
217
292
|
if (subTypesUpdates.length > 0) {
|
|
218
293
|
let subUpdate = `update "${Type_1.default.GetTableName(this._type)}" set `;
|
|
219
294
|
for (let p of subTypesUpdates) {
|
|
@@ -381,12 +456,11 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
381
456
|
}
|
|
382
457
|
UpdateObjectAsync(obj, cascade, relationsAllowed, fieldsAllowed, visiteds = []) {
|
|
383
458
|
return this.CreatePromisse(() => __awaiter(this, void 0, void 0, function* () {
|
|
384
|
-
var _a, _b;
|
|
459
|
+
var _a, _b, _c, _d;
|
|
385
460
|
relationsAllowed = relationsAllowed !== null && relationsAllowed !== void 0 ? relationsAllowed : [];
|
|
386
461
|
visiteds = visiteds !== null && visiteds !== void 0 ? visiteds : [];
|
|
387
462
|
if (visiteds.indexOf(obj) > -1)
|
|
388
463
|
return obj;
|
|
389
|
-
visiteds.push(obj);
|
|
390
464
|
if (!this.IsCorrectType(obj))
|
|
391
465
|
throw new InvalidOperationException_1.default(`The object passed as argument is not a ${this._type.name} instance`);
|
|
392
466
|
if (!obj)
|
|
@@ -436,6 +510,11 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
436
510
|
continue;
|
|
437
511
|
values += `"${map.Column}" = ${this.CreateValueStatement(colType, Reflect.get(obj, map.Field))},`;
|
|
438
512
|
}
|
|
513
|
+
if (key == undefined)
|
|
514
|
+
throw new InvalidOperationException_1.default(`The type ${this._type.name} must have a primary key column`);
|
|
515
|
+
if (visiteds.filter(s => s && s.constructor == obj.constructor && Reflect.get(s, key.Property) == Reflect.get(obj, key.Property)).length > 0)
|
|
516
|
+
return obj;
|
|
517
|
+
visiteds.push(obj);
|
|
439
518
|
update = `${update} ${values.substring(0, values.length - 1)}`;
|
|
440
519
|
for (let where of wheres) {
|
|
441
520
|
update += ` ${where.StatementType} ${this.EvaluateStatement(where)} `;
|
|
@@ -443,18 +522,20 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
443
522
|
if (values.trim().length > 1)
|
|
444
523
|
yield this._manager.ExecuteNonQueryAsync(update);
|
|
445
524
|
let subTypesUpdates = [];
|
|
525
|
+
let objectsToUpdate = [];
|
|
526
|
+
let objectsToAdd = [];
|
|
527
|
+
let buildSubupdates = [];
|
|
528
|
+
let updatableFields = [];
|
|
446
529
|
for (let sub of subTypes) {
|
|
447
530
|
let subObj = Reflect.get(obj, sub.Field);
|
|
448
531
|
let metadata = Type_1.default.ExtractMetadata(obj);
|
|
449
532
|
let meta = metadata.filter(s => s.Field == sub.Field && s.Loaded);
|
|
533
|
+
let objetsToRemoveThisReferece = { HasRelation: false, IsArray: false, SubIsArray: false, SubField: "", Relation: undefined, SubRelation: undefined };
|
|
450
534
|
if (((meta.length > 0 && meta[0].Loaded) || relationsAllowed.filter(s => s == sub.Field).length > 0) && subObj == undefined) {
|
|
451
535
|
subTypesUpdates.push(`"${sub.Column}" = null`);
|
|
452
|
-
continue;
|
|
453
536
|
}
|
|
454
537
|
if (meta.length == 0 && relationsAllowed.filter(s => s == sub.Field).length == 0)
|
|
455
538
|
continue;
|
|
456
|
-
if (meta.length > 0)
|
|
457
|
-
relationsAllowed.push(meta[0].Field);
|
|
458
539
|
let relation = SchemasDecorators_1.default.GetRelationAttribute(this._type, sub.Field);
|
|
459
540
|
let subType = Type_1.default.GetDesingType(this._type, sub.Field);
|
|
460
541
|
if (!subType && !relation)
|
|
@@ -468,9 +549,11 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
468
549
|
continue;
|
|
469
550
|
subType = relation === null || relation === void 0 ? void 0 : relation.TypeBuilder();
|
|
470
551
|
}
|
|
471
|
-
|
|
472
|
-
if (subObj == undefined)
|
|
552
|
+
if (relationsAllowed.filter(s => s == sub.Field).length == 0 && this.GetChanges(meta, subObj, subType).length == 0)
|
|
473
553
|
continue;
|
|
554
|
+
if (meta.length > 0)
|
|
555
|
+
relationsAllowed.push(meta[0].Field);
|
|
556
|
+
let subPK = SchemasDecorators_1.default.ExtractPrimaryKey(subType);
|
|
474
557
|
if (subPK == undefined)
|
|
475
558
|
throw new InvalidOperationException_1.default(`The type ${subType.name} must have a primary key column`);
|
|
476
559
|
if (key == undefined)
|
|
@@ -483,13 +566,24 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
483
566
|
if (subRelation && subRelation.TypeBuilder() == this._type) {
|
|
484
567
|
if (subRelation.Field != undefined && subRelation.Field != sub.Field)
|
|
485
568
|
continue;
|
|
569
|
+
updatableFields.push(subKey);
|
|
570
|
+
objetsToRemoveThisReferece.HasRelation = true;
|
|
571
|
+
objetsToRemoveThisReferece.Relation = relation;
|
|
572
|
+
objetsToRemoveThisReferece.SubRelation = subRelation;
|
|
573
|
+
objetsToRemoveThisReferece.SubField = subKey;
|
|
486
574
|
hasSubrelation = true;
|
|
487
575
|
if (subRelation.Relation == RelationType_1.RelationType.ONE_TO_MANY || subRelation.Relation == RelationType_1.RelationType.MANY_TO_MANY) {
|
|
576
|
+
let subFKTypeIsArray = Type_1.default.GetDesingType(subType, subKey) == Array;
|
|
577
|
+
objetsToRemoveThisReferece.IsArray = isArray;
|
|
578
|
+
objetsToRemoveThisReferece.SubIsArray = subFKTypeIsArray;
|
|
579
|
+
if (subObj == undefined || visiteds.indexOf(subObj) > -1)
|
|
580
|
+
continue;
|
|
488
581
|
if (isArray) {
|
|
582
|
+
if (subObj == undefined)
|
|
583
|
+
continue;
|
|
489
584
|
for (let i of subObj) {
|
|
490
|
-
if (i == undefined)
|
|
585
|
+
if (i == undefined || visiteds.indexOf(i) > -1)
|
|
491
586
|
continue;
|
|
492
|
-
let subFKTypeIsArray = Type_1.default.GetDesingType(subType, subKey) == Array;
|
|
493
587
|
if (subFKTypeIsArray) {
|
|
494
588
|
let value = [];
|
|
495
589
|
let subMeta = Type_1.default.ExtractMetadata(i);
|
|
@@ -511,7 +605,8 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
511
605
|
}
|
|
512
606
|
}
|
|
513
607
|
else {
|
|
514
|
-
|
|
608
|
+
if (subObj == undefined || visiteds.indexOf(subObj) > -1)
|
|
609
|
+
continue;
|
|
515
610
|
if (subFKTypeIsArray) {
|
|
516
611
|
let value = [];
|
|
517
612
|
let subMeta = Type_1.default.ExtractMetadata(subObj);
|
|
@@ -533,9 +628,11 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
533
628
|
}
|
|
534
629
|
}
|
|
535
630
|
else {
|
|
631
|
+
if (subObj == undefined || visiteds.indexOf(subObj) > -1)
|
|
632
|
+
continue;
|
|
536
633
|
if (subRelation.Relation == RelationType_1.RelationType.MANY_TO_ONE) {
|
|
537
634
|
for (let i of subObj) {
|
|
538
|
-
if (i == undefined)
|
|
635
|
+
if (i == undefined || visiteds.indexOf(i) > -1)
|
|
539
636
|
continue;
|
|
540
637
|
Reflect.set(i, subKey, obj);
|
|
541
638
|
}
|
|
@@ -548,40 +645,124 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
548
645
|
}
|
|
549
646
|
}
|
|
550
647
|
let colletion = this._context.Collection(subType);
|
|
648
|
+
if (!hasSubrelation || (cascade || relationsAllowed.filter(s => s == sub.Field).length > 0))
|
|
649
|
+
if (meta.length > 0 && objetsToRemoveThisReferece.HasRelation) {
|
|
650
|
+
let v = meta[0].Value;
|
|
651
|
+
let changes = this.GetChanges(meta, subObj, subType);
|
|
652
|
+
if (v instanceof Array)
|
|
653
|
+
meta[0].Value = meta[0].Value.filter((s) => changes.indexOf(s) == -1);
|
|
654
|
+
else if (v == changes[0])
|
|
655
|
+
meta[0].Loaded = false;
|
|
656
|
+
for (let c of changes) {
|
|
657
|
+
let item = yield colletion["Where"]({ Field: subPK, Value: c })["LoadRelationOn"](objetsToRemoveThisReferece.SubField)["FirstOrDefaultAsync"]();
|
|
658
|
+
if (item) {
|
|
659
|
+
if (objetsToRemoveThisReferece.SubIsArray) {
|
|
660
|
+
item[objetsToRemoveThisReferece.SubField] =
|
|
661
|
+
item[objetsToRemoveThisReferece.SubField].filter(s => s && Reflect.get(s, key.Property) != Reflect.get(obj, key.Property));
|
|
662
|
+
}
|
|
663
|
+
else if (((_c = objetsToRemoveThisReferece.SubRelation) === null || _c === void 0 ? void 0 : _c.Relation) != RelationType_1.RelationType.ONE_TO_MANY) {
|
|
664
|
+
item[objetsToRemoveThisReferece.SubField] = undefined;
|
|
665
|
+
}
|
|
666
|
+
yield colletion["UpdateObjectAsync"](item, false, [], [], visiteds);
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
551
670
|
if (isArray) {
|
|
671
|
+
if (subObj == undefined)
|
|
672
|
+
continue;
|
|
552
673
|
for (let i of subObj) {
|
|
553
674
|
if (i == undefined)
|
|
554
675
|
continue;
|
|
555
|
-
if (!Type_1.default.HasValue(Reflect.get(i, subPK)))
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
676
|
+
if (!Type_1.default.HasValue(Reflect.get(i, subPK))) {
|
|
677
|
+
let cs = objectsToAdd.filter(s => s.Type == subType);
|
|
678
|
+
if (cs.length == 0)
|
|
679
|
+
objectsToAdd.push({ Objs: [i], Type: subType, SubPK: subPK });
|
|
680
|
+
else
|
|
681
|
+
cs[0].Objs.push(i);
|
|
682
|
+
}
|
|
683
|
+
else if (!hasSubrelation || (cascade || relationsAllowed.filter(s => s == sub.Field).length > 0)) {
|
|
684
|
+
let cs = objectsToUpdate.filter(s => s.Type == subType);
|
|
685
|
+
if (cs.length == 0)
|
|
686
|
+
objectsToUpdate.push({ Objs: [{ Obj: i, UpdatableFields: updatableFields }], Type: subType, SubPK: subPK });
|
|
687
|
+
else {
|
|
688
|
+
let ccs = cs.filter(s => s.Objs.filter(j => j.Obj == i).length > 0);
|
|
689
|
+
if (ccs.length == 0) {
|
|
690
|
+
cs[0].Objs.push({ Obj: i, UpdatableFields: updatableFields });
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
ccs[0].Objs[0].UpdatableFields.push(...updatableFields);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
}
|
|
559
697
|
}
|
|
560
698
|
}
|
|
561
699
|
else {
|
|
562
700
|
if (subObj == undefined)
|
|
563
701
|
continue;
|
|
564
|
-
if (!Type_1.default.HasValue(Reflect.get(subObj, subPK)))
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
702
|
+
if (!Type_1.default.HasValue(Reflect.get(subObj, subPK))) {
|
|
703
|
+
let cs = objectsToAdd.filter(s => s.Type == subType);
|
|
704
|
+
if (cs.length == 0)
|
|
705
|
+
objectsToAdd.push({ Objs: [subObj], Type: subType, SubPK: subPK });
|
|
706
|
+
else
|
|
707
|
+
cs[0].Objs.push(subObj);
|
|
708
|
+
}
|
|
709
|
+
else if (!hasSubrelation || (cascade || relationsAllowed.filter(s => s == sub.Field).length > 0)) {
|
|
710
|
+
let cs = objectsToUpdate.filter(s => s.Type == subType);
|
|
711
|
+
if (cs.length == 0)
|
|
712
|
+
objectsToUpdate.push({ Objs: [{ Obj: subObj, UpdatableFields: updatableFields }], Type: subType, SubPK: subPK });
|
|
713
|
+
else {
|
|
714
|
+
let ccs = cs.filter(s => s.Objs.filter(j => j.Obj == subObj).length > 0);
|
|
715
|
+
if (ccs.length == 0) {
|
|
716
|
+
cs[0].Objs.push({ Obj: subObj, UpdatableFields: updatableFields });
|
|
717
|
+
}
|
|
718
|
+
else {
|
|
719
|
+
ccs[0].Objs[0].UpdatableFields.push(...updatableFields);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
581
722
|
}
|
|
582
723
|
}
|
|
583
|
-
|
|
724
|
+
buildSubupdates.push(() => {
|
|
725
|
+
let spk = SchemasDecorators_1.default.ExtractPrimaryKey(subType);
|
|
726
|
+
let columnType = Type_1.default.CastType(Type_1.default.GetDesingTimeTypeName(subType, spk));
|
|
727
|
+
if ((relation === null || relation === void 0 ? void 0 : relation.Relation) == RelationType_1.RelationType.MANY_TO_MANY || (relation === null || relation === void 0 ? void 0 : relation.Relation) == RelationType_1.RelationType.ONE_TO_MANY || isArray)
|
|
728
|
+
columnType = Type_1.default.AsArray(columnType);
|
|
729
|
+
if (subObj == undefined)
|
|
730
|
+
return;
|
|
731
|
+
let updateValues = [Reflect.get(subObj, spk)];
|
|
732
|
+
if (isArray) {
|
|
733
|
+
updateValues = [];
|
|
734
|
+
for (let i of subObj) {
|
|
735
|
+
if (i == undefined)
|
|
736
|
+
continue;
|
|
737
|
+
updateValues.push(Reflect.get(i, spk));
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
Type_1.default.InjectMetadata(obj, {
|
|
741
|
+
Field: sub.Field,
|
|
742
|
+
Type: columnType,
|
|
743
|
+
Value: updateValues,
|
|
744
|
+
Loaded: true
|
|
745
|
+
});
|
|
746
|
+
subTypesUpdates.push(`"${sub.Column}" = ${this.CreateValueStatement(columnType, isArray ? updateValues : updateValues[0])}`);
|
|
747
|
+
});
|
|
584
748
|
}
|
|
749
|
+
objectsToAdd.forEach(o => {
|
|
750
|
+
o.Objs = o.Objs.filter((i, ix, s) => {
|
|
751
|
+
return ix == s.findIndex(v => v == i);
|
|
752
|
+
});
|
|
753
|
+
});
|
|
754
|
+
for (let cs of objectsToAdd) {
|
|
755
|
+
let colletion = this._context.Collection(cs.Type);
|
|
756
|
+
for (let i of cs.Objs)
|
|
757
|
+
yield colletion["AddObjectAsync"](i, true, [], visiteds);
|
|
758
|
+
}
|
|
759
|
+
for (let cs of objectsToUpdate) {
|
|
760
|
+
let colletion = this._context.Collection(cs.Type);
|
|
761
|
+
for (let i of cs.Objs)
|
|
762
|
+
yield colletion["UpdateObjectAsync"](i.Obj, false, (_d = i.UpdatableFields) !== null && _d !== void 0 ? _d : [], [], visiteds);
|
|
763
|
+
}
|
|
764
|
+
for (let b of buildSubupdates)
|
|
765
|
+
b();
|
|
585
766
|
if (subTypesUpdates.length > 0) {
|
|
586
767
|
let subUpdate = `update "${Type_1.default.GetTableName(this._type)}" set `;
|
|
587
768
|
for (let p of subTypesUpdates) {
|
|
@@ -601,6 +782,25 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
601
782
|
return obj;
|
|
602
783
|
}));
|
|
603
784
|
}
|
|
785
|
+
GetChanges(meta, subObj, subType) {
|
|
786
|
+
let v = meta[0].Value;
|
|
787
|
+
let subPK = SchemasDecorators_1.default.ExtractPrimaryKey(subType);
|
|
788
|
+
let g = Reflect.get;
|
|
789
|
+
if (v == undefined)
|
|
790
|
+
return [];
|
|
791
|
+
if (v instanceof Array && subObj instanceof Array)
|
|
792
|
+
if (v.length == 0 || v.every(s => subObj.find(u => g(u, subPK) == s)))
|
|
793
|
+
return [];
|
|
794
|
+
else
|
|
795
|
+
return v.filter(s => !subObj.find(u => g(u, subPK) == s));
|
|
796
|
+
if (v instanceof Array && subObj == undefined)
|
|
797
|
+
return v;
|
|
798
|
+
if (v && subObj == undefined)
|
|
799
|
+
return [v];
|
|
800
|
+
if (v != g(subObj, subPK))
|
|
801
|
+
return [v];
|
|
802
|
+
return [];
|
|
803
|
+
}
|
|
604
804
|
DeleteSelectionAsync() {
|
|
605
805
|
return this.CreatePromisse(() => __awaiter(this, void 0, void 0, function* () {
|
|
606
806
|
let whereSrt = PGSetHelper_1.default.ExtractWhereData(this);
|
|
@@ -718,14 +918,24 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
718
918
|
CountAsync() {
|
|
719
919
|
return __awaiter(this, void 0, void 0, function* () {
|
|
720
920
|
return this.CreatePromisse(() => __awaiter(this, void 0, void 0, function* () {
|
|
921
|
+
let whereSrt = PGSetHelper_1.default.ExtractWhereData(this);
|
|
922
|
+
let sqlSrt = PGSetHelper_1.default.ExtractSQLData(this);
|
|
721
923
|
let query = `select count(*) from "${this._table}"`;
|
|
722
|
-
if (
|
|
723
|
-
|
|
924
|
+
if (sqlSrt && sqlSrt.toLowerCase().trim().startsWith(`select distinct "${this._table}".*`)) {
|
|
925
|
+
query = sqlSrt;
|
|
724
926
|
}
|
|
725
|
-
if (
|
|
726
|
-
|
|
927
|
+
if (!whereSrt) {
|
|
928
|
+
if (this._whereAsString != undefined && this._statements.length > 0) {
|
|
929
|
+
throw new InvalidOperationException_1.default("Is not possible combine free and structured queries");
|
|
930
|
+
}
|
|
931
|
+
if (this._whereAsString != undefined) {
|
|
932
|
+
query += ` ${this._whereAsString} `;
|
|
933
|
+
}
|
|
934
|
+
query += this.EvaluateWhere();
|
|
935
|
+
}
|
|
936
|
+
else {
|
|
937
|
+
query += whereSrt;
|
|
727
938
|
}
|
|
728
|
-
query += this.EvaluateWhere();
|
|
729
939
|
let ordenation = "";
|
|
730
940
|
for (let orderby of this._ordering) {
|
|
731
941
|
ordenation += `${this.EvaluateOrderBy(orderby)},`;
|
|
@@ -739,11 +949,14 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
739
949
|
if (this._limit != undefined) {
|
|
740
950
|
query += ` limit ${this._limit.Limit}`;
|
|
741
951
|
}
|
|
952
|
+
if (sqlSrt && sqlSrt.toLowerCase().trim().startsWith(`select distinct "${this._table}".*`)) {
|
|
953
|
+
query = `select count(*) from (${query}) as counter`;
|
|
954
|
+
}
|
|
742
955
|
var r = yield this._manager.ExecuteAsync(query);
|
|
743
956
|
this.Reset();
|
|
744
957
|
if (!r || r.rows.length == 0)
|
|
745
958
|
return 0;
|
|
746
|
-
return r.rows[0].count;
|
|
959
|
+
return Number.parseInt(r.rows[0].count);
|
|
747
960
|
}));
|
|
748
961
|
});
|
|
749
962
|
}
|
|
@@ -1103,6 +1316,7 @@ class PGDBSet extends myorm_core_1.AbstractSet {
|
|
|
1103
1316
|
let colletion = this._context.Collection(type);
|
|
1104
1317
|
if (colletion == undefined)
|
|
1105
1318
|
continue;
|
|
1319
|
+
colletion["Reset"]();
|
|
1106
1320
|
let subKey = SchemasDecorators_1.default.ExtractPrimaryKey(type);
|
|
1107
1321
|
if ((relation === null || relation === void 0 ? void 0 : relation.Relation) == RelationType_1.RelationType.MANY_TO_MANY || (relation === null || relation === void 0 ? void 0 : relation.Relation) == RelationType_1.RelationType.ONE_TO_MANY) {
|
|
1108
1322
|
let values = Reflect.get(row, map.Column);
|