myorm_pg 6.1.3 → 6.2.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 (142) hide show
  1. package/lib/__tests__/classes/RawTypes.d.ts +3 -0
  2. package/lib/__tests__/classes/RawTypes.d.ts.map +1 -0
  3. package/lib/__tests__/classes/RawTypes.js +16 -0
  4. package/lib/__tests__/classes/RawTypes.js.map +1 -0
  5. package/lib/__tests__/classes/RelationEntity.d.ts +12 -0
  6. package/lib/__tests__/classes/RelationEntity.d.ts.map +1 -0
  7. package/lib/__tests__/classes/RelationEntity.js +65 -0
  8. package/lib/__tests__/classes/RelationEntity.js.map +1 -0
  9. package/lib/__tests__/classes/TestContext.d.ts +9 -0
  10. package/lib/__tests__/classes/TestContext.d.ts.map +1 -0
  11. package/lib/__tests__/classes/TestContext.js +14 -0
  12. package/lib/__tests__/classes/TestContext.js.map +1 -0
  13. package/lib/__tests__/classes/TestEntity.d.ts +18 -0
  14. package/lib/__tests__/classes/TestEntity.d.ts.map +1 -0
  15. package/lib/__tests__/classes/TestEntity.js +99 -0
  16. package/lib/__tests__/classes/TestEntity.js.map +1 -0
  17. package/lib/__tests__/functions/TestFunctions.d.ts +11 -0
  18. package/lib/__tests__/functions/TestFunctions.d.ts.map +1 -0
  19. package/lib/__tests__/functions/TestFunctions.js +137 -0
  20. package/lib/__tests__/functions/TestFunctions.js.map +1 -0
  21. package/lib/src/Index.d.ts.map +1 -0
  22. package/lib/src/Index.js.map +1 -0
  23. package/lib/src/core/decorators/SchemasDecorators.d.ts.map +1 -0
  24. package/lib/src/core/decorators/SchemasDecorators.js.map +1 -0
  25. package/lib/src/core/design/Type.d.ts.map +1 -0
  26. package/lib/{core → src/core}/design/Type.js +1 -0
  27. package/lib/src/core/design/Type.js.map +1 -0
  28. package/lib/src/core/enums/DBTypes.d.ts.map +1 -0
  29. package/lib/src/core/enums/DBTypes.js.map +1 -0
  30. package/lib/src/core/enums/RelationType.d.ts.map +1 -0
  31. package/lib/src/core/enums/RelationType.js.map +1 -0
  32. package/lib/src/core/exceptions/ConnectionFailException.d.ts.map +1 -0
  33. package/lib/src/core/exceptions/ConnectionFailException.js.map +1 -0
  34. package/lib/src/core/exceptions/ConstraintFailException.d.ts.map +1 -0
  35. package/lib/src/core/exceptions/ConstraintFailException.js.map +1 -0
  36. package/lib/src/core/exceptions/Exception.d.ts.map +1 -0
  37. package/lib/src/core/exceptions/Exception.js.map +1 -0
  38. package/lib/src/core/exceptions/InvalidOperationException.d.ts.map +1 -0
  39. package/lib/src/core/exceptions/InvalidOperationException.js.map +1 -0
  40. package/lib/src/core/exceptions/NotImplementedException.d.ts.map +1 -0
  41. package/lib/src/core/exceptions/NotImplementedException.js.map +1 -0
  42. package/lib/src/core/exceptions/QueryFailException.d.ts.map +1 -0
  43. package/lib/src/core/exceptions/QueryFailException.js.map +1 -0
  44. package/lib/src/core/exceptions/TypeNotMappedException.d.ts.map +1 -0
  45. package/lib/src/core/exceptions/TypeNotMappedException.js.map +1 -0
  46. package/lib/src/core/exceptions/TypeNotSuportedException.d.ts.map +1 -0
  47. package/lib/src/core/exceptions/TypeNotSuportedException.js.map +1 -0
  48. package/lib/src/core/handlers/DBOperationLogHandler.d.ts.map +1 -0
  49. package/lib/src/core/handlers/DBOperationLogHandler.js.map +1 -0
  50. package/lib/src/implementations/PGDBConnection.d.ts.map +1 -0
  51. package/lib/src/implementations/PGDBConnection.js.map +1 -0
  52. package/lib/{implementations → src/implementations}/PGDBContext.d.ts +5 -1
  53. package/lib/src/implementations/PGDBContext.d.ts.map +1 -0
  54. package/lib/src/implementations/PGDBContext.js +343 -0
  55. package/lib/src/implementations/PGDBContext.js.map +1 -0
  56. package/lib/src/implementations/PGDBManager.d.ts.map +1 -0
  57. package/lib/{implementations → src/implementations}/PGDBManager.js +2 -0
  58. package/lib/src/implementations/PGDBManager.js.map +1 -0
  59. package/lib/{implementations → src/implementations}/PGDBSet.d.ts +3 -1
  60. package/lib/src/implementations/PGDBSet.d.ts.map +1 -0
  61. package/lib/{implementations → src/implementations}/PGDBSet.js +284 -66
  62. package/lib/src/implementations/PGDBSet.js.map +1 -0
  63. package/lib/src/implementations/PGFluentField.d.ts.map +1 -0
  64. package/lib/src/implementations/PGFluentField.js.map +1 -0
  65. package/lib/src/implementations/PGSetHelper.d.ts.map +1 -0
  66. package/lib/src/implementations/PGSetHelper.js.map +1 -0
  67. package/package.json +2 -2
  68. package/lib/Index.d.ts.map +0 -1
  69. package/lib/Index.js.map +0 -1
  70. package/lib/core/decorators/SchemasDecorators.d.ts.map +0 -1
  71. package/lib/core/decorators/SchemasDecorators.js.map +0 -1
  72. package/lib/core/design/Type.d.ts.map +0 -1
  73. package/lib/core/design/Type.js.map +0 -1
  74. package/lib/core/enums/DBTypes.d.ts.map +0 -1
  75. package/lib/core/enums/DBTypes.js.map +0 -1
  76. package/lib/core/enums/RelationType.d.ts.map +0 -1
  77. package/lib/core/enums/RelationType.js.map +0 -1
  78. package/lib/core/exceptions/ConnectionFailException.d.ts.map +0 -1
  79. package/lib/core/exceptions/ConnectionFailException.js.map +0 -1
  80. package/lib/core/exceptions/ConstraintFailException.d.ts.map +0 -1
  81. package/lib/core/exceptions/ConstraintFailException.js.map +0 -1
  82. package/lib/core/exceptions/Exception.d.ts.map +0 -1
  83. package/lib/core/exceptions/Exception.js.map +0 -1
  84. package/lib/core/exceptions/InvalidOperationException.d.ts.map +0 -1
  85. package/lib/core/exceptions/InvalidOperationException.js.map +0 -1
  86. package/lib/core/exceptions/NotImplementedException.d.ts.map +0 -1
  87. package/lib/core/exceptions/NotImplementedException.js.map +0 -1
  88. package/lib/core/exceptions/QueryFailException.d.ts.map +0 -1
  89. package/lib/core/exceptions/QueryFailException.js.map +0 -1
  90. package/lib/core/exceptions/TypeNotMappedException.d.ts.map +0 -1
  91. package/lib/core/exceptions/TypeNotMappedException.js.map +0 -1
  92. package/lib/core/exceptions/TypeNotSuportedException.d.ts.map +0 -1
  93. package/lib/core/exceptions/TypeNotSuportedException.js.map +0 -1
  94. package/lib/core/handlers/DBOperationLogHandler.d.ts.map +0 -1
  95. package/lib/core/handlers/DBOperationLogHandler.js.map +0 -1
  96. package/lib/implementations/PGDBConnection.d.ts.map +0 -1
  97. package/lib/implementations/PGDBConnection.js.map +0 -1
  98. package/lib/implementations/PGDBContext.d.ts.map +0 -1
  99. package/lib/implementations/PGDBContext.js +0 -302
  100. package/lib/implementations/PGDBContext.js.map +0 -1
  101. package/lib/implementations/PGDBManager.d.ts.map +0 -1
  102. package/lib/implementations/PGDBManager.js.map +0 -1
  103. package/lib/implementations/PGDBSet.d.ts.map +0 -1
  104. package/lib/implementations/PGDBSet.js.map +0 -1
  105. package/lib/implementations/PGFluentField.d.ts.map +0 -1
  106. package/lib/implementations/PGFluentField.js.map +0 -1
  107. package/lib/implementations/PGSetHelper.d.ts.map +0 -1
  108. package/lib/implementations/PGSetHelper.js.map +0 -1
  109. /package/lib/{Index.d.ts → src/Index.d.ts} +0 -0
  110. /package/lib/{Index.js → src/Index.js} +0 -0
  111. /package/lib/{core → src/core}/decorators/SchemasDecorators.d.ts +0 -0
  112. /package/lib/{core → src/core}/decorators/SchemasDecorators.js +0 -0
  113. /package/lib/{core → src/core}/design/Type.d.ts +0 -0
  114. /package/lib/{core → src/core}/enums/DBTypes.d.ts +0 -0
  115. /package/lib/{core → src/core}/enums/DBTypes.js +0 -0
  116. /package/lib/{core → src/core}/enums/RelationType.d.ts +0 -0
  117. /package/lib/{core → src/core}/enums/RelationType.js +0 -0
  118. /package/lib/{core → src/core}/exceptions/ConnectionFailException.d.ts +0 -0
  119. /package/lib/{core → src/core}/exceptions/ConnectionFailException.js +0 -0
  120. /package/lib/{core → src/core}/exceptions/ConstraintFailException.d.ts +0 -0
  121. /package/lib/{core → src/core}/exceptions/ConstraintFailException.js +0 -0
  122. /package/lib/{core → src/core}/exceptions/Exception.d.ts +0 -0
  123. /package/lib/{core → src/core}/exceptions/Exception.js +0 -0
  124. /package/lib/{core → src/core}/exceptions/InvalidOperationException.d.ts +0 -0
  125. /package/lib/{core → src/core}/exceptions/InvalidOperationException.js +0 -0
  126. /package/lib/{core → src/core}/exceptions/NotImplementedException.d.ts +0 -0
  127. /package/lib/{core → src/core}/exceptions/NotImplementedException.js +0 -0
  128. /package/lib/{core → src/core}/exceptions/QueryFailException.d.ts +0 -0
  129. /package/lib/{core → src/core}/exceptions/QueryFailException.js +0 -0
  130. /package/lib/{core → src/core}/exceptions/TypeNotMappedException.d.ts +0 -0
  131. /package/lib/{core → src/core}/exceptions/TypeNotMappedException.js +0 -0
  132. /package/lib/{core → src/core}/exceptions/TypeNotSuportedException.d.ts +0 -0
  133. /package/lib/{core → src/core}/exceptions/TypeNotSuportedException.js +0 -0
  134. /package/lib/{core → src/core}/handlers/DBOperationLogHandler.d.ts +0 -0
  135. /package/lib/{core → src/core}/handlers/DBOperationLogHandler.js +0 -0
  136. /package/lib/{implementations → src/implementations}/PGDBConnection.d.ts +0 -0
  137. /package/lib/{implementations → src/implementations}/PGDBConnection.js +0 -0
  138. /package/lib/{implementations → src/implementations}/PGDBManager.d.ts +0 -0
  139. /package/lib/{implementations → src/implementations}/PGFluentField.d.ts +0 -0
  140. /package/lib/{implementations → src/implementations}/PGFluentField.js +0 -0
  141. /package/lib/{implementations → src/implementations}/PGSetHelper.d.ts +0 -0
  142. /package/lib/{implementations → src/implementations}/PGSetHelper.js +0 -0
@@ -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,11 @@ 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);
95
+ if (Type_1.default.HasValue(Reflect.get(obj, key.Property)))
96
+ throw new InvalidOperationException_1.default(`Can not add a ${this._type.name} with ${key.Property} provided`);
91
97
  sql = sql.substring(0, sql.length - 1) + ") ";
92
98
  values = values.substring(0, values.length - 1) + ")";
93
99
  let insert = `${sql} ${values} ${returnKey};`;
@@ -97,6 +103,9 @@ class PGDBSet extends myorm_core_1.AbstractSet {
97
103
  }
98
104
  let subTypesUpdates = [];
99
105
  let updatableFields = [];
106
+ let objectsToUpdate = [];
107
+ let objectsToAdd = [];
108
+ let buildSubupdates = [];
100
109
  for (let sub of subTypes) {
101
110
  let relation = SchemasDecorators_1.default.GetRelationAttribute(this._type, sub.Field);
102
111
  let subType = Type_1.default.GetDesingType(this._type, sub.Field);
@@ -124,11 +133,13 @@ class PGDBSet extends myorm_core_1.AbstractSet {
124
133
  if (subRelation && subRelation.TypeBuilder() == this._type) {
125
134
  if (subRelation.Field != undefined && subRelation.Field != sub.Field)
126
135
  continue;
136
+ updatableFields.push(subKey);
127
137
  if (subRelation.Relation == RelationType_1.RelationType.ONE_TO_MANY || subRelation.Relation == RelationType_1.RelationType.MANY_TO_MANY) {
128
- updatableFields.push(subKey);
129
138
  if (isArray) {
139
+ if (subObj == undefined || visiteds.indexOf(subObj) > -1)
140
+ continue;
130
141
  for (let i of subObj) {
131
- if (i == undefined)
142
+ if (i == undefined || visiteds.indexOf(i) > -1)
132
143
  continue;
133
144
  let metadata = Type_1.default.ExtractMetadata(i).filter(s => s.Field == subKey && s.Loaded);
134
145
  let value = [];
@@ -145,6 +156,8 @@ class PGDBSet extends myorm_core_1.AbstractSet {
145
156
  }
146
157
  }
147
158
  else {
159
+ if (subObj == undefined || visiteds.indexOf(subObj) > -1)
160
+ continue;
148
161
  let metadata = Type_1.default.ExtractMetadata(subObj).filter(s => s.Field == subKey && s.Loaded);
149
162
  let value = [];
150
163
  if (metadata.length > 0) {
@@ -162,12 +175,14 @@ class PGDBSet extends myorm_core_1.AbstractSet {
162
175
  else {
163
176
  if (subRelation.Relation == RelationType_1.RelationType.MANY_TO_ONE && isArray) {
164
177
  for (let i of subObj) {
165
- if (i == undefined)
178
+ if (i == undefined || visiteds.indexOf(i) > -1)
166
179
  continue;
167
180
  Reflect.set(i, subKey, obj);
168
181
  }
169
182
  }
170
183
  else {
184
+ if (subObj == undefined || visiteds.indexOf(subObj) > -1)
185
+ continue;
171
186
  Reflect.set(subObj, subKey, obj);
172
187
  }
173
188
  }
@@ -175,43 +190,105 @@ class PGDBSet extends myorm_core_1.AbstractSet {
175
190
  }
176
191
  }
177
192
  if (isArray) {
193
+ if (subObj == undefined)
194
+ continue;
178
195
  for (let i of subObj) {
179
196
  if (i == undefined)
180
197
  continue;
181
198
  if (!Type_1.default.HasValue(Reflect.get(i, subPK))) {
182
- if (cascade || relations.filter(s => s == sub.Field))
183
- 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
+ }
184
220
  }
185
- else
186
- yield colletion["UpdateObjectAsync"](i, false, updatableFields);
187
221
  }
188
222
  }
189
223
  else {
190
224
  if (subObj == undefined)
191
225
  continue;
192
226
  if (!Type_1.default.HasValue(Reflect.get(subObj, subPK))) {
193
- if (cascade || relations.filter(s => s == sub.Field))
194
- 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
+ }
195
234
  }
196
- else
197
- yield colletion["UpdateObjectAsync"](subObj, false, updatableFields);
198
- }
199
- let columnType = Type_1.default.CastType(Type_1.default.GetDesingTimeTypeName(subType, subPK));
200
- 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)
201
- columnType = Type_1.default.AsArray(columnType);
202
- if (subObj == undefined)
203
- continue;
204
- let updateValues = [Reflect.get(subObj, subPK)];
205
- if (isArray) {
206
- updateValues = [];
207
- for (let i of subObj) {
208
- if (i == undefined)
209
- continue;
210
- 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
+ }
211
248
  }
212
249
  }
213
- 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
+ });
214
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();
215
292
  if (subTypesUpdates.length > 0) {
216
293
  let subUpdate = `update "${Type_1.default.GetTableName(this._type)}" set `;
217
294
  for (let p of subTypesUpdates) {
@@ -379,12 +456,11 @@ class PGDBSet extends myorm_core_1.AbstractSet {
379
456
  }
380
457
  UpdateObjectAsync(obj, cascade, relationsAllowed, fieldsAllowed, visiteds = []) {
381
458
  return this.CreatePromisse(() => __awaiter(this, void 0, void 0, function* () {
382
- var _a, _b;
459
+ var _a, _b, _c, _d;
383
460
  relationsAllowed = relationsAllowed !== null && relationsAllowed !== void 0 ? relationsAllowed : [];
384
461
  visiteds = visiteds !== null && visiteds !== void 0 ? visiteds : [];
385
462
  if (visiteds.indexOf(obj) > -1)
386
463
  return obj;
387
- visiteds.push(obj);
388
464
  if (!this.IsCorrectType(obj))
389
465
  throw new InvalidOperationException_1.default(`The object passed as argument is not a ${this._type.name} instance`);
390
466
  if (!obj)
@@ -434,6 +510,11 @@ class PGDBSet extends myorm_core_1.AbstractSet {
434
510
  continue;
435
511
  values += `"${map.Column}" = ${this.CreateValueStatement(colType, Reflect.get(obj, map.Field))},`;
436
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);
437
518
  update = `${update} ${values.substring(0, values.length - 1)}`;
438
519
  for (let where of wheres) {
439
520
  update += ` ${where.StatementType} ${this.EvaluateStatement(where)} `;
@@ -441,18 +522,20 @@ class PGDBSet extends myorm_core_1.AbstractSet {
441
522
  if (values.trim().length > 1)
442
523
  yield this._manager.ExecuteNonQueryAsync(update);
443
524
  let subTypesUpdates = [];
525
+ let objectsToUpdate = [];
526
+ let objectsToAdd = [];
527
+ let buildSubupdates = [];
528
+ let updatableFields = [];
444
529
  for (let sub of subTypes) {
445
530
  let subObj = Reflect.get(obj, sub.Field);
446
531
  let metadata = Type_1.default.ExtractMetadata(obj);
447
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 };
448
534
  if (((meta.length > 0 && meta[0].Loaded) || relationsAllowed.filter(s => s == sub.Field).length > 0) && subObj == undefined) {
449
535
  subTypesUpdates.push(`"${sub.Column}" = null`);
450
- continue;
451
536
  }
452
537
  if (meta.length == 0 && relationsAllowed.filter(s => s == sub.Field).length == 0)
453
538
  continue;
454
- if (meta.length > 0)
455
- relationsAllowed.push(meta[0].Field);
456
539
  let relation = SchemasDecorators_1.default.GetRelationAttribute(this._type, sub.Field);
457
540
  let subType = Type_1.default.GetDesingType(this._type, sub.Field);
458
541
  if (!subType && !relation)
@@ -466,9 +549,11 @@ class PGDBSet extends myorm_core_1.AbstractSet {
466
549
  continue;
467
550
  subType = relation === null || relation === void 0 ? void 0 : relation.TypeBuilder();
468
551
  }
469
- let subPK = SchemasDecorators_1.default.ExtractPrimaryKey(subType);
470
- if (subObj == undefined)
552
+ if (relationsAllowed.filter(s => s == sub.Field).length == 0 && this.GetChanges(meta, subObj, subType).length == 0)
471
553
  continue;
554
+ if (meta.length > 0)
555
+ relationsAllowed.push(meta[0].Field);
556
+ let subPK = SchemasDecorators_1.default.ExtractPrimaryKey(subType);
472
557
  if (subPK == undefined)
473
558
  throw new InvalidOperationException_1.default(`The type ${subType.name} must have a primary key column`);
474
559
  if (key == undefined)
@@ -481,13 +566,24 @@ class PGDBSet extends myorm_core_1.AbstractSet {
481
566
  if (subRelation && subRelation.TypeBuilder() == this._type) {
482
567
  if (subRelation.Field != undefined && subRelation.Field != sub.Field)
483
568
  continue;
569
+ updatableFields.push(subKey);
570
+ objetsToRemoveThisReferece.HasRelation = true;
571
+ objetsToRemoveThisReferece.Relation = relation;
572
+ objetsToRemoveThisReferece.SubRelation = subRelation;
573
+ objetsToRemoveThisReferece.SubField = subKey;
484
574
  hasSubrelation = true;
485
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;
486
581
  if (isArray) {
582
+ if (subObj == undefined)
583
+ continue;
487
584
  for (let i of subObj) {
488
- if (i == undefined)
585
+ if (i == undefined || visiteds.indexOf(i) > -1)
489
586
  continue;
490
- let subFKTypeIsArray = Type_1.default.GetDesingType(subType, subKey) == Array;
491
587
  if (subFKTypeIsArray) {
492
588
  let value = [];
493
589
  let subMeta = Type_1.default.ExtractMetadata(i);
@@ -499,6 +595,7 @@ class PGDBSet extends myorm_core_1.AbstractSet {
499
595
  value = item == undefined ? [] : item[subKey];
500
596
  value = value !== null && value !== void 0 ? value : [];
501
597
  }
598
+ value = value.filter(s => Reflect.get(s, key.Property) != Reflect.get(obj, key.Property));
502
599
  value.push(obj);
503
600
  Reflect.set(i, subKey, value);
504
601
  }
@@ -508,7 +605,8 @@ class PGDBSet extends myorm_core_1.AbstractSet {
508
605
  }
509
606
  }
510
607
  else {
511
- let subFKTypeIsArray = Type_1.default.GetDesingType(subType, subKey) == Array;
608
+ if (subObj == undefined || visiteds.indexOf(subObj) > -1)
609
+ continue;
512
610
  if (subFKTypeIsArray) {
513
611
  let value = [];
514
612
  let subMeta = Type_1.default.ExtractMetadata(subObj);
@@ -520,6 +618,7 @@ class PGDBSet extends myorm_core_1.AbstractSet {
520
618
  value = item == undefined ? [] : item[subKey];
521
619
  value = value !== null && value !== void 0 ? value : [];
522
620
  }
621
+ value = value.filter(s => Reflect.get(s, key.Property) != Reflect.get(obj, key.Property));
523
622
  value.push(obj);
524
623
  Reflect.set(subObj, subKey, value);
525
624
  }
@@ -529,9 +628,11 @@ class PGDBSet extends myorm_core_1.AbstractSet {
529
628
  }
530
629
  }
531
630
  else {
631
+ if (subObj == undefined || visiteds.indexOf(subObj) > -1)
632
+ continue;
532
633
  if (subRelation.Relation == RelationType_1.RelationType.MANY_TO_ONE) {
533
634
  for (let i of subObj) {
534
- if (i == undefined)
635
+ if (i == undefined || visiteds.indexOf(i) > -1)
535
636
  continue;
536
637
  Reflect.set(i, subKey, obj);
537
638
  }
@@ -544,40 +645,124 @@ class PGDBSet extends myorm_core_1.AbstractSet {
544
645
  }
545
646
  }
546
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
+ }
547
670
  if (isArray) {
671
+ if (subObj == undefined)
672
+ continue;
548
673
  for (let i of subObj) {
549
674
  if (i == undefined)
550
675
  continue;
551
- if (!Type_1.default.HasValue(Reflect.get(i, subPK)))
552
- yield colletion["AddAsync"](i);
553
- else if (!hasSubrelation || (cascade || relationsAllowed.filter(s => s == sub.Field).length > 0))
554
- 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
+ }
555
697
  }
556
698
  }
557
699
  else {
558
700
  if (subObj == undefined)
559
701
  continue;
560
- if (!Type_1.default.HasValue(Reflect.get(subObj, subPK)))
561
- yield colletion["AddAsync"](subObj);
562
- else if (!hasSubrelation || (cascade || relationsAllowed.filter(s => s == sub.Field).length > 0))
563
- yield colletion["UpdateObjectAsync"](subObj, false, [], [], visiteds);
564
- }
565
- let columnType = Type_1.default.CastType(Type_1.default.GetDesingTimeTypeName(subType, subPK));
566
- 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)
567
- columnType = Type_1.default.AsArray(columnType);
568
- if (subObj == undefined)
569
- continue;
570
- let updateValues = [Reflect.get(subObj, subPK)];
571
- if (isArray) {
572
- updateValues = [];
573
- for (let i of subObj) {
574
- if (i == undefined)
575
- continue;
576
- 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
+ }
577
722
  }
578
723
  }
579
- 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
+ });
580
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();
581
766
  if (subTypesUpdates.length > 0) {
582
767
  let subUpdate = `update "${Type_1.default.GetTableName(this._type)}" set `;
583
768
  for (let p of subTypesUpdates) {
@@ -597,6 +782,25 @@ class PGDBSet extends myorm_core_1.AbstractSet {
597
782
  return obj;
598
783
  }));
599
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
+ }
600
804
  DeleteSelectionAsync() {
601
805
  return this.CreatePromisse(() => __awaiter(this, void 0, void 0, function* () {
602
806
  let whereSrt = PGSetHelper_1.default.ExtractWhereData(this);
@@ -714,14 +918,24 @@ class PGDBSet extends myorm_core_1.AbstractSet {
714
918
  CountAsync() {
715
919
  return __awaiter(this, void 0, void 0, function* () {
716
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);
717
923
  let query = `select count(*) from "${this._table}"`;
718
- if (this._whereAsString != undefined && this._statements.length > 0) {
719
- 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;
720
926
  }
721
- if (this._whereAsString != undefined) {
722
- 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;
723
938
  }
724
- query += this.EvaluateWhere();
725
939
  let ordenation = "";
726
940
  for (let orderby of this._ordering) {
727
941
  ordenation += `${this.EvaluateOrderBy(orderby)},`;
@@ -735,11 +949,14 @@ class PGDBSet extends myorm_core_1.AbstractSet {
735
949
  if (this._limit != undefined) {
736
950
  query += ` limit ${this._limit.Limit}`;
737
951
  }
952
+ if (sqlSrt && sqlSrt.toLowerCase().trim().startsWith(`select distinct "${this._table}".*`)) {
953
+ query = `select count(*) from (${query}) as counter`;
954
+ }
738
955
  var r = yield this._manager.ExecuteAsync(query);
739
956
  this.Reset();
740
957
  if (!r || r.rows.length == 0)
741
958
  return 0;
742
- return r.rows[0].count;
959
+ return Number.parseInt(r.rows[0].count);
743
960
  }));
744
961
  });
745
962
  }
@@ -1099,6 +1316,7 @@ class PGDBSet extends myorm_core_1.AbstractSet {
1099
1316
  let colletion = this._context.Collection(type);
1100
1317
  if (colletion == undefined)
1101
1318
  continue;
1319
+ colletion["Reset"]();
1102
1320
  let subKey = SchemasDecorators_1.default.ExtractPrimaryKey(type);
1103
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) {
1104
1322
  let values = Reflect.get(row, map.Column);