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.
Files changed (115) hide show
  1. package/lib/core/design/Type.d.ts.map +1 -1
  2. package/lib/core/design/Type.js +1 -0
  3. package/lib/core/design/Type.js.map +1 -1
  4. package/lib/implementations/PGDBContext.d.ts +5 -1
  5. package/lib/implementations/PGDBContext.d.ts.map +1 -1
  6. package/lib/implementations/PGDBContext.js +159 -118
  7. package/lib/implementations/PGDBContext.js.map +1 -1
  8. package/lib/implementations/PGDBManager.d.ts.map +1 -1
  9. package/lib/implementations/PGDBManager.js +2 -0
  10. package/lib/implementations/PGDBManager.js.map +1 -1
  11. package/lib/implementations/PGDBSet.d.ts +3 -1
  12. package/lib/implementations/PGDBSet.d.ts.map +1 -1
  13. package/lib/implementations/PGDBSet.js +280 -66
  14. package/lib/implementations/PGDBSet.js.map +1 -1
  15. package/package.json +2 -2
  16. package/lib/__tests__/classes/RawTypes.d.ts +0 -3
  17. package/lib/__tests__/classes/RawTypes.d.ts.map +0 -1
  18. package/lib/__tests__/classes/RawTypes.js +0 -16
  19. package/lib/__tests__/classes/RawTypes.js.map +0 -1
  20. package/lib/__tests__/classes/RelationEntity.d.ts +0 -12
  21. package/lib/__tests__/classes/RelationEntity.d.ts.map +0 -1
  22. package/lib/__tests__/classes/RelationEntity.js +0 -65
  23. package/lib/__tests__/classes/RelationEntity.js.map +0 -1
  24. package/lib/__tests__/classes/TestContext.d.ts +0 -9
  25. package/lib/__tests__/classes/TestContext.d.ts.map +0 -1
  26. package/lib/__tests__/classes/TestContext.js +0 -14
  27. package/lib/__tests__/classes/TestContext.js.map +0 -1
  28. package/lib/__tests__/classes/TestEntity.d.ts +0 -18
  29. package/lib/__tests__/classes/TestEntity.d.ts.map +0 -1
  30. package/lib/__tests__/classes/TestEntity.js +0 -99
  31. package/lib/__tests__/classes/TestEntity.js.map +0 -1
  32. package/lib/__tests__/functions/TestFunctions.d.ts +0 -11
  33. package/lib/__tests__/functions/TestFunctions.d.ts.map +0 -1
  34. package/lib/__tests__/functions/TestFunctions.js +0 -137
  35. package/lib/__tests__/functions/TestFunctions.js.map +0 -1
  36. package/lib/src/Index.d.ts +0 -41
  37. package/lib/src/Index.d.ts.map +0 -1
  38. package/lib/src/Index.js +0 -64
  39. package/lib/src/Index.js.map +0 -1
  40. package/lib/src/core/decorators/SchemasDecorators.d.ts +0 -45
  41. package/lib/src/core/decorators/SchemasDecorators.d.ts.map +0 -1
  42. package/lib/src/core/decorators/SchemasDecorators.js +0 -145
  43. package/lib/src/core/decorators/SchemasDecorators.js.map +0 -1
  44. package/lib/src/core/design/Type.d.ts +0 -39
  45. package/lib/src/core/design/Type.d.ts.map +0 -1
  46. package/lib/src/core/design/Type.js +0 -144
  47. package/lib/src/core/design/Type.js.map +0 -1
  48. package/lib/src/core/enums/DBTypes.d.ts +0 -19
  49. package/lib/src/core/enums/DBTypes.d.ts.map +0 -1
  50. package/lib/src/core/enums/DBTypes.js +0 -23
  51. package/lib/src/core/enums/DBTypes.js.map +0 -1
  52. package/lib/src/core/enums/RelationType.d.ts +0 -7
  53. package/lib/src/core/enums/RelationType.d.ts.map +0 -1
  54. package/lib/src/core/enums/RelationType.js +0 -11
  55. package/lib/src/core/enums/RelationType.js.map +0 -1
  56. package/lib/src/core/exceptions/ConnectionFailException.d.ts +0 -5
  57. package/lib/src/core/exceptions/ConnectionFailException.d.ts.map +0 -1
  58. package/lib/src/core/exceptions/ConnectionFailException.js +0 -13
  59. package/lib/src/core/exceptions/ConnectionFailException.js.map +0 -1
  60. package/lib/src/core/exceptions/ConstraintFailException.d.ts +0 -5
  61. package/lib/src/core/exceptions/ConstraintFailException.d.ts.map +0 -1
  62. package/lib/src/core/exceptions/ConstraintFailException.js +0 -13
  63. package/lib/src/core/exceptions/ConstraintFailException.js.map +0 -1
  64. package/lib/src/core/exceptions/Exception.d.ts +0 -5
  65. package/lib/src/core/exceptions/Exception.d.ts.map +0 -1
  66. package/lib/src/core/exceptions/Exception.js +0 -10
  67. package/lib/src/core/exceptions/Exception.js.map +0 -1
  68. package/lib/src/core/exceptions/InvalidOperationException.d.ts +0 -6
  69. package/lib/src/core/exceptions/InvalidOperationException.d.ts.map +0 -1
  70. package/lib/src/core/exceptions/InvalidOperationException.js +0 -14
  71. package/lib/src/core/exceptions/InvalidOperationException.js.map +0 -1
  72. package/lib/src/core/exceptions/NotImplementedException.d.ts +0 -5
  73. package/lib/src/core/exceptions/NotImplementedException.d.ts.map +0 -1
  74. package/lib/src/core/exceptions/NotImplementedException.js +0 -13
  75. package/lib/src/core/exceptions/NotImplementedException.js.map +0 -1
  76. package/lib/src/core/exceptions/QueryFailException.d.ts +0 -6
  77. package/lib/src/core/exceptions/QueryFailException.d.ts.map +0 -1
  78. package/lib/src/core/exceptions/QueryFailException.js +0 -14
  79. package/lib/src/core/exceptions/QueryFailException.js.map +0 -1
  80. package/lib/src/core/exceptions/TypeNotMappedException.d.ts +0 -5
  81. package/lib/src/core/exceptions/TypeNotMappedException.d.ts.map +0 -1
  82. package/lib/src/core/exceptions/TypeNotMappedException.js +0 -13
  83. package/lib/src/core/exceptions/TypeNotMappedException.js.map +0 -1
  84. package/lib/src/core/exceptions/TypeNotSuportedException.d.ts +0 -5
  85. package/lib/src/core/exceptions/TypeNotSuportedException.d.ts.map +0 -1
  86. package/lib/src/core/exceptions/TypeNotSuportedException.js +0 -13
  87. package/lib/src/core/exceptions/TypeNotSuportedException.js.map +0 -1
  88. package/lib/src/core/handlers/DBOperationLogHandler.d.ts +0 -17
  89. package/lib/src/core/handlers/DBOperationLogHandler.d.ts.map +0 -1
  90. package/lib/src/core/handlers/DBOperationLogHandler.js +0 -18
  91. package/lib/src/core/handlers/DBOperationLogHandler.js.map +0 -1
  92. package/lib/src/implementations/PGDBConnection.d.ts +0 -19
  93. package/lib/src/implementations/PGDBConnection.d.ts.map +0 -1
  94. package/lib/src/implementations/PGDBConnection.js +0 -105
  95. package/lib/src/implementations/PGDBConnection.js.map +0 -1
  96. package/lib/src/implementations/PGDBContext.d.ts +0 -54
  97. package/lib/src/implementations/PGDBContext.d.ts.map +0 -1
  98. package/lib/src/implementations/PGDBContext.js +0 -302
  99. package/lib/src/implementations/PGDBContext.js.map +0 -1
  100. package/lib/src/implementations/PGDBManager.d.ts +0 -37
  101. package/lib/src/implementations/PGDBManager.d.ts.map +0 -1
  102. package/lib/src/implementations/PGDBManager.js +0 -296
  103. package/lib/src/implementations/PGDBManager.js.map +0 -1
  104. package/lib/src/implementations/PGDBSet.d.ts +0 -60
  105. package/lib/src/implementations/PGDBSet.d.ts.map +0 -1
  106. package/lib/src/implementations/PGDBSet.js +0 -1385
  107. package/lib/src/implementations/PGDBSet.js.map +0 -1
  108. package/lib/src/implementations/PGFluentField.d.ts +0 -18
  109. package/lib/src/implementations/PGFluentField.d.ts.map +0 -1
  110. package/lib/src/implementations/PGFluentField.js +0 -155
  111. package/lib/src/implementations/PGFluentField.js.map +0 -1
  112. package/lib/src/implementations/PGSetHelper.d.ts +0 -19
  113. package/lib/src/implementations/PGSetHelper.d.ts.map +0 -1
  114. package/lib/src/implementations/PGSetHelper.js +0 -48
  115. 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
- yield colletion["AddAsync"](i);
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
- yield colletion["AddAsync"](subObj);
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
- yield colletion["UpdateObjectAsync"](subObj, false, updatableFields);
200
- }
201
- let columnType = Type_1.default.CastType(Type_1.default.GetDesingTimeTypeName(subType, subPK));
202
- 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)
203
- columnType = Type_1.default.AsArray(columnType);
204
- if (subObj == undefined)
205
- continue;
206
- let updateValues = [Reflect.get(subObj, subPK)];
207
- if (isArray) {
208
- updateValues = [];
209
- for (let i of subObj) {
210
- if (i == undefined)
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
- subTypesUpdates.push(`"${sub.Column}" = ${this.CreateValueStatement(columnType, isArray ? updateValues : updateValues[0])}`);
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
- let subPK = SchemasDecorators_1.default.ExtractPrimaryKey(subType);
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
- let subFKTypeIsArray = Type_1.default.GetDesingType(subType, subKey) == Array;
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
- yield colletion["AddAsync"](i);
557
- else if (!hasSubrelation || (cascade || relationsAllowed.filter(s => s == sub.Field).length > 0))
558
- yield colletion["UpdateObjectAsync"](i, false, [], [], visiteds);
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
- yield colletion["AddAsync"](subObj);
566
- else if (!hasSubrelation || (cascade || relationsAllowed.filter(s => s == sub.Field).length > 0))
567
- yield colletion["UpdateObjectAsync"](subObj, false, [], [], visiteds);
568
- }
569
- let columnType = Type_1.default.CastType(Type_1.default.GetDesingTimeTypeName(subType, subPK));
570
- 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)
571
- columnType = Type_1.default.AsArray(columnType);
572
- if (subObj == undefined)
573
- continue;
574
- let updateValues = [Reflect.get(subObj, subPK)];
575
- if (isArray) {
576
- updateValues = [];
577
- for (let i of subObj) {
578
- if (i == undefined)
579
- continue;
580
- updateValues.push(Reflect.get(i, subPK));
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
- subTypesUpdates.push(`"${sub.Column}" = ${this.CreateValueStatement(columnType, isArray ? updateValues : updateValues[0])}`);
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 (this._whereAsString != undefined && this._statements.length > 0) {
723
- throw new InvalidOperationException_1.default("Is not possible combine free and structured queries");
924
+ if (sqlSrt && sqlSrt.toLowerCase().trim().startsWith(`select distinct "${this._table}".*`)) {
925
+ query = sqlSrt;
724
926
  }
725
- if (this._whereAsString != undefined) {
726
- query += ` ${this._whereAsString} `;
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);