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.
- package/lib/__tests__/classes/RawTypes.d.ts +3 -0
- package/lib/__tests__/classes/RawTypes.d.ts.map +1 -0
- package/lib/__tests__/classes/RawTypes.js +16 -0
- package/lib/__tests__/classes/RawTypes.js.map +1 -0
- package/lib/__tests__/classes/RelationEntity.d.ts +12 -0
- package/lib/__tests__/classes/RelationEntity.d.ts.map +1 -0
- package/lib/__tests__/classes/RelationEntity.js +65 -0
- package/lib/__tests__/classes/RelationEntity.js.map +1 -0
- package/lib/__tests__/classes/TestContext.d.ts +9 -0
- package/lib/__tests__/classes/TestContext.d.ts.map +1 -0
- package/lib/__tests__/classes/TestContext.js +14 -0
- package/lib/__tests__/classes/TestContext.js.map +1 -0
- package/lib/__tests__/classes/TestEntity.d.ts +18 -0
- package/lib/__tests__/classes/TestEntity.d.ts.map +1 -0
- package/lib/__tests__/classes/TestEntity.js +99 -0
- package/lib/__tests__/classes/TestEntity.js.map +1 -0
- package/lib/__tests__/functions/TestFunctions.d.ts +11 -0
- package/lib/__tests__/functions/TestFunctions.d.ts.map +1 -0
- package/lib/__tests__/functions/TestFunctions.js +137 -0
- package/lib/__tests__/functions/TestFunctions.js.map +1 -0
- package/lib/src/Index.d.ts.map +1 -0
- package/lib/src/Index.js.map +1 -0
- package/lib/src/core/decorators/SchemasDecorators.d.ts.map +1 -0
- package/lib/src/core/decorators/SchemasDecorators.js.map +1 -0
- package/lib/src/core/design/Type.d.ts.map +1 -0
- package/lib/{core → src/core}/design/Type.js +1 -0
- package/lib/src/core/design/Type.js.map +1 -0
- package/lib/src/core/enums/DBTypes.d.ts.map +1 -0
- package/lib/src/core/enums/DBTypes.js.map +1 -0
- package/lib/src/core/enums/RelationType.d.ts.map +1 -0
- package/lib/src/core/enums/RelationType.js.map +1 -0
- package/lib/src/core/exceptions/ConnectionFailException.d.ts.map +1 -0
- package/lib/src/core/exceptions/ConnectionFailException.js.map +1 -0
- package/lib/src/core/exceptions/ConstraintFailException.d.ts.map +1 -0
- package/lib/src/core/exceptions/ConstraintFailException.js.map +1 -0
- package/lib/src/core/exceptions/Exception.d.ts.map +1 -0
- package/lib/src/core/exceptions/Exception.js.map +1 -0
- package/lib/src/core/exceptions/InvalidOperationException.d.ts.map +1 -0
- package/lib/src/core/exceptions/InvalidOperationException.js.map +1 -0
- package/lib/src/core/exceptions/NotImplementedException.d.ts.map +1 -0
- package/lib/src/core/exceptions/NotImplementedException.js.map +1 -0
- package/lib/src/core/exceptions/QueryFailException.d.ts.map +1 -0
- package/lib/src/core/exceptions/QueryFailException.js.map +1 -0
- package/lib/src/core/exceptions/TypeNotMappedException.d.ts.map +1 -0
- package/lib/src/core/exceptions/TypeNotMappedException.js.map +1 -0
- package/lib/src/core/exceptions/TypeNotSuportedException.d.ts.map +1 -0
- package/lib/src/core/exceptions/TypeNotSuportedException.js.map +1 -0
- package/lib/src/core/handlers/DBOperationLogHandler.d.ts.map +1 -0
- package/lib/src/core/handlers/DBOperationLogHandler.js.map +1 -0
- package/lib/src/implementations/PGDBConnection.d.ts.map +1 -0
- package/lib/src/implementations/PGDBConnection.js.map +1 -0
- package/lib/{implementations → src/implementations}/PGDBContext.d.ts +5 -1
- package/lib/src/implementations/PGDBContext.d.ts.map +1 -0
- package/lib/src/implementations/PGDBContext.js +343 -0
- package/lib/src/implementations/PGDBContext.js.map +1 -0
- package/lib/src/implementations/PGDBManager.d.ts.map +1 -0
- package/lib/{implementations → src/implementations}/PGDBManager.js +2 -0
- package/lib/src/implementations/PGDBManager.js.map +1 -0
- package/lib/{implementations → src/implementations}/PGDBSet.d.ts +3 -1
- package/lib/src/implementations/PGDBSet.d.ts.map +1 -0
- package/lib/{implementations → src/implementations}/PGDBSet.js +284 -66
- package/lib/src/implementations/PGDBSet.js.map +1 -0
- package/lib/src/implementations/PGFluentField.d.ts.map +1 -0
- package/lib/src/implementations/PGFluentField.js.map +1 -0
- package/lib/src/implementations/PGSetHelper.d.ts.map +1 -0
- package/lib/src/implementations/PGSetHelper.js.map +1 -0
- package/package.json +2 -2
- package/lib/Index.d.ts.map +0 -1
- package/lib/Index.js.map +0 -1
- package/lib/core/decorators/SchemasDecorators.d.ts.map +0 -1
- package/lib/core/decorators/SchemasDecorators.js.map +0 -1
- package/lib/core/design/Type.d.ts.map +0 -1
- package/lib/core/design/Type.js.map +0 -1
- package/lib/core/enums/DBTypes.d.ts.map +0 -1
- package/lib/core/enums/DBTypes.js.map +0 -1
- package/lib/core/enums/RelationType.d.ts.map +0 -1
- package/lib/core/enums/RelationType.js.map +0 -1
- package/lib/core/exceptions/ConnectionFailException.d.ts.map +0 -1
- package/lib/core/exceptions/ConnectionFailException.js.map +0 -1
- package/lib/core/exceptions/ConstraintFailException.d.ts.map +0 -1
- package/lib/core/exceptions/ConstraintFailException.js.map +0 -1
- package/lib/core/exceptions/Exception.d.ts.map +0 -1
- package/lib/core/exceptions/Exception.js.map +0 -1
- package/lib/core/exceptions/InvalidOperationException.d.ts.map +0 -1
- package/lib/core/exceptions/InvalidOperationException.js.map +0 -1
- package/lib/core/exceptions/NotImplementedException.d.ts.map +0 -1
- package/lib/core/exceptions/NotImplementedException.js.map +0 -1
- package/lib/core/exceptions/QueryFailException.d.ts.map +0 -1
- package/lib/core/exceptions/QueryFailException.js.map +0 -1
- package/lib/core/exceptions/TypeNotMappedException.d.ts.map +0 -1
- package/lib/core/exceptions/TypeNotMappedException.js.map +0 -1
- package/lib/core/exceptions/TypeNotSuportedException.d.ts.map +0 -1
- package/lib/core/exceptions/TypeNotSuportedException.js.map +0 -1
- package/lib/core/handlers/DBOperationLogHandler.d.ts.map +0 -1
- package/lib/core/handlers/DBOperationLogHandler.js.map +0 -1
- package/lib/implementations/PGDBConnection.d.ts.map +0 -1
- package/lib/implementations/PGDBConnection.js.map +0 -1
- package/lib/implementations/PGDBContext.d.ts.map +0 -1
- package/lib/implementations/PGDBContext.js +0 -302
- package/lib/implementations/PGDBContext.js.map +0 -1
- package/lib/implementations/PGDBManager.d.ts.map +0 -1
- package/lib/implementations/PGDBManager.js.map +0 -1
- package/lib/implementations/PGDBSet.d.ts.map +0 -1
- package/lib/implementations/PGDBSet.js.map +0 -1
- package/lib/implementations/PGFluentField.d.ts.map +0 -1
- package/lib/implementations/PGFluentField.js.map +0 -1
- package/lib/implementations/PGSetHelper.d.ts.map +0 -1
- package/lib/implementations/PGSetHelper.js.map +0 -1
- /package/lib/{Index.d.ts → src/Index.d.ts} +0 -0
- /package/lib/{Index.js → src/Index.js} +0 -0
- /package/lib/{core → src/core}/decorators/SchemasDecorators.d.ts +0 -0
- /package/lib/{core → src/core}/decorators/SchemasDecorators.js +0 -0
- /package/lib/{core → src/core}/design/Type.d.ts +0 -0
- /package/lib/{core → src/core}/enums/DBTypes.d.ts +0 -0
- /package/lib/{core → src/core}/enums/DBTypes.js +0 -0
- /package/lib/{core → src/core}/enums/RelationType.d.ts +0 -0
- /package/lib/{core → src/core}/enums/RelationType.js +0 -0
- /package/lib/{core → src/core}/exceptions/ConnectionFailException.d.ts +0 -0
- /package/lib/{core → src/core}/exceptions/ConnectionFailException.js +0 -0
- /package/lib/{core → src/core}/exceptions/ConstraintFailException.d.ts +0 -0
- /package/lib/{core → src/core}/exceptions/ConstraintFailException.js +0 -0
- /package/lib/{core → src/core}/exceptions/Exception.d.ts +0 -0
- /package/lib/{core → src/core}/exceptions/Exception.js +0 -0
- /package/lib/{core → src/core}/exceptions/InvalidOperationException.d.ts +0 -0
- /package/lib/{core → src/core}/exceptions/InvalidOperationException.js +0 -0
- /package/lib/{core → src/core}/exceptions/NotImplementedException.d.ts +0 -0
- /package/lib/{core → src/core}/exceptions/NotImplementedException.js +0 -0
- /package/lib/{core → src/core}/exceptions/QueryFailException.d.ts +0 -0
- /package/lib/{core → src/core}/exceptions/QueryFailException.js +0 -0
- /package/lib/{core → src/core}/exceptions/TypeNotMappedException.d.ts +0 -0
- /package/lib/{core → src/core}/exceptions/TypeNotMappedException.js +0 -0
- /package/lib/{core → src/core}/exceptions/TypeNotSuportedException.d.ts +0 -0
- /package/lib/{core → src/core}/exceptions/TypeNotSuportedException.js +0 -0
- /package/lib/{core → src/core}/handlers/DBOperationLogHandler.d.ts +0 -0
- /package/lib/{core → src/core}/handlers/DBOperationLogHandler.js +0 -0
- /package/lib/{implementations → src/implementations}/PGDBConnection.d.ts +0 -0
- /package/lib/{implementations → src/implementations}/PGDBConnection.js +0 -0
- /package/lib/{implementations → src/implementations}/PGDBManager.d.ts +0 -0
- /package/lib/{implementations → src/implementations}/PGFluentField.d.ts +0 -0
- /package/lib/{implementations → src/implementations}/PGFluentField.js +0 -0
- /package/lib/{implementations → src/implementations}/PGSetHelper.d.ts +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
553
|
-
|
|
554
|
-
|
|
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
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
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
|
-
|
|
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 (
|
|
719
|
-
|
|
924
|
+
if (sqlSrt && sqlSrt.toLowerCase().trim().startsWith(`select distinct "${this._table}".*`)) {
|
|
925
|
+
query = sqlSrt;
|
|
720
926
|
}
|
|
721
|
-
if (
|
|
722
|
-
|
|
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);
|