innomize-typeorm
Version:
Data-Mapper ORM for TypeScript, ES7, ES6, ES5. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, MongoDB databases.
81 lines (79 loc) • 4.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var Subject_1 = require("../Subject");
/**
* Finds all cascade operations of the given subject and cascade operations of the found cascaded subjects,
* e.g. builds a cascade tree and creates a subjects for them.
*/
var CascadesSubjectBuilder = /** @class */ (function () {
// ---------------------------------------------------------------------
// Constructor
// ---------------------------------------------------------------------
function CascadesSubjectBuilder(allSubjects) {
this.allSubjects = allSubjects;
}
// ---------------------------------------------------------------------
// Public Methods
// ---------------------------------------------------------------------
/**
* Builds a cascade subjects tree and pushes them in into the given array of subjects.
*/
CascadesSubjectBuilder.prototype.build = function (subject) {
var _this = this;
subject.metadata
.extractRelationValuesFromEntity(subject.entity, subject.metadata.relations) // todo: we can create EntityMetadata.cascadeRelations
.forEach(function (_a) {
var _b = tslib_1.__read(_a, 3), relation = _b[0], relationEntity = _b[1], relationEntityMetadata = _b[2];
// we need only defined values and insert or update cascades of the relation should be set
if (relationEntity === undefined ||
relationEntity === null ||
(!relation.isCascadeInsert && !relation.isCascadeUpdate))
return;
// if relation entity is just a relation id set (for example post.tag = 1)
// then we don't really need to check cascades since there is no object to insert or update
if (!(relationEntity instanceof Object))
return;
// if we already has this entity in list of operated subjects then skip it to avoid recursion
var alreadyExistRelationEntitySubject = _this.findByPersistEntityLike(relationEntityMetadata.target, relationEntity);
if (alreadyExistRelationEntitySubject) {
if (alreadyExistRelationEntitySubject.canBeInserted === false) // if its not marked for insertion yet
alreadyExistRelationEntitySubject.canBeInserted = relation.isCascadeInsert === true;
if (alreadyExistRelationEntitySubject.canBeUpdated === false) // if its not marked for update yet
alreadyExistRelationEntitySubject.canBeUpdated = relation.isCascadeUpdate === true;
return;
}
// mark subject with what we can do with it
// and add to the array of subjects to load only if there is no same entity there already
var relationEntitySubject = new Subject_1.Subject({
metadata: relationEntityMetadata,
parentSubject: subject,
entity: relationEntity,
canBeInserted: relation.isCascadeInsert === true,
canBeUpdated: relation.isCascadeUpdate === true
});
_this.allSubjects.push(relationEntitySubject);
// go recursively and find other entities we need to insert/update
_this.build(relationEntitySubject);
});
};
// ---------------------------------------------------------------------
// Protected Methods
// ---------------------------------------------------------------------
/**
* Finds subject where entity like given subject's entity.
* Comparision made by entity id.
*/
CascadesSubjectBuilder.prototype.findByPersistEntityLike = function (entityTarget, entity) {
return this.allSubjects.find(function (subject) {
if (!subject.entity)
return false;
if (subject.entity === entity)
return true;
return subject.metadata.target === entityTarget && subject.metadata.compareEntities(subject.entityWithFulfilledIds, entity);
});
};
return CascadesSubjectBuilder;
}());
exports.CascadesSubjectBuilder = CascadesSubjectBuilder;
//# sourceMappingURL=CascadesSubjectBuilder.js.map