typeorm
Version:
Data-Mapper ORM for TypeScript, ES7, ES6, ES5. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, MongoDB databases.
622 lines (620 loc) • 42.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EntityMetadataBuilder = void 0;
var tslib_1 = require("tslib");
var CockroachDriver_1 = require("../driver/cockroachdb/CockroachDriver");
var SapDriver_1 = require("../driver/sap/SapDriver");
var EntityMetadata_1 = require("../metadata/EntityMetadata");
var ColumnMetadata_1 = require("../metadata/ColumnMetadata");
var IndexMetadata_1 = require("../metadata/IndexMetadata");
var RelationMetadata_1 = require("../metadata/RelationMetadata");
var EmbeddedMetadata_1 = require("../metadata/EmbeddedMetadata");
var RelationIdMetadata_1 = require("../metadata/RelationIdMetadata");
var RelationCountMetadata_1 = require("../metadata/RelationCountMetadata");
var EventListenerTypes_1 = require("../metadata/types/EventListenerTypes");
var MetadataUtils_1 = require("./MetadataUtils");
var JunctionEntityMetadataBuilder_1 = require("./JunctionEntityMetadataBuilder");
var ClosureJunctionEntityMetadataBuilder_1 = require("./ClosureJunctionEntityMetadataBuilder");
var RelationJoinColumnBuilder_1 = require("./RelationJoinColumnBuilder");
var EntityListenerMetadata_1 = require("../metadata/EntityListenerMetadata");
var UniqueMetadata_1 = require("../metadata/UniqueMetadata");
var MysqlDriver_1 = require("../driver/mysql/MysqlDriver");
var CheckMetadata_1 = require("../metadata/CheckMetadata");
var SqlServerDriver_1 = require("../driver/sqlserver/SqlServerDriver");
var PostgresDriver_1 = require("../driver/postgres/PostgresDriver");
var ExclusionMetadata_1 = require("../metadata/ExclusionMetadata");
var AuroraDataApiDriver_1 = require("../driver/aurora-data-api/AuroraDataApiDriver");
var error_1 = require("../error");
/**
* Builds EntityMetadata objects and all its sub-metadatas.
*/
var EntityMetadataBuilder = /** @class */ (function () {
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
function EntityMetadataBuilder(connection, metadataArgsStorage) {
this.connection = connection;
this.metadataArgsStorage = metadataArgsStorage;
this.junctionEntityMetadataBuilder = new JunctionEntityMetadataBuilder_1.JunctionEntityMetadataBuilder(connection);
this.closureJunctionEntityMetadataBuilder = new ClosureJunctionEntityMetadataBuilder_1.ClosureJunctionEntityMetadataBuilder(connection);
this.relationJoinColumnBuilder = new RelationJoinColumnBuilder_1.RelationJoinColumnBuilder(connection);
}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* Builds a complete entity metadatas for the given entity classes.
*/
EntityMetadataBuilder.prototype.build = function (entityClasses) {
var _this = this;
// if entity classes to filter entities by are given then do filtering, otherwise use all
var allTables = entityClasses ? this.metadataArgsStorage.filterTables(entityClasses) : this.metadataArgsStorage.tables;
// filter out table metadata args for those we really create entity metadatas and tables in the db
var realTables = allTables.filter(function (table) { return table.type === "regular" || table.type === "closure" || table.type === "entity-child" || table.type === "view"; });
// create entity metadatas for a user defined entities (marked with @Entity decorator or loaded from entity schemas)
var entityMetadatas = realTables.map(function (tableArgs) { return _this.createEntityMetadata(tableArgs); });
// compute parent entity metadatas for table inheritance
entityMetadatas.forEach(function (entityMetadata) { return _this.computeParentEntityMetadata(entityMetadatas, entityMetadata); });
// after all metadatas created we set child entity metadatas for table inheritance
entityMetadatas.forEach(function (metadata) {
metadata.childEntityMetadatas = entityMetadatas.filter(function (childMetadata) {
return metadata.target instanceof Function
&& childMetadata.target instanceof Function
&& MetadataUtils_1.MetadataUtils.isInherited(childMetadata.target, metadata.target);
});
});
// build entity metadata (step0), first for non-single-table-inherited entity metadatas (dependant)
entityMetadatas
.filter(function (entityMetadata) { return entityMetadata.tableType !== "entity-child"; })
.forEach(function (entityMetadata) { return entityMetadata.build(); });
// build entity metadata (step0), now for single-table-inherited entity metadatas (dependant)
entityMetadatas
.filter(function (entityMetadata) { return entityMetadata.tableType === "entity-child"; })
.forEach(function (entityMetadata) { return entityMetadata.build(); });
// compute entity metadata columns, relations, etc. first for the regular, non-single-table-inherited entity metadatas
entityMetadatas
.filter(function (entityMetadata) { return entityMetadata.tableType !== "entity-child"; })
.forEach(function (entityMetadata) { return _this.computeEntityMetadataStep1(entityMetadatas, entityMetadata); });
// then do it for single table inheritance children (since they are depend on their parents to be built)
entityMetadatas
.filter(function (entityMetadata) { return entityMetadata.tableType === "entity-child"; })
.forEach(function (entityMetadata) { return _this.computeEntityMetadataStep1(entityMetadatas, entityMetadata); });
// calculate entity metadata computed properties and all its sub-metadatas
entityMetadatas.forEach(function (entityMetadata) { return _this.computeEntityMetadataStep2(entityMetadata); });
// calculate entity metadata's inverse properties
entityMetadatas.forEach(function (entityMetadata) { return _this.computeInverseProperties(entityMetadata, entityMetadatas); });
// go through all entity metadatas and create foreign keys / junction entity metadatas for their relations
entityMetadatas
.filter(function (entityMetadata) { return entityMetadata.tableType !== "entity-child"; })
.forEach(function (entityMetadata) {
// create entity's relations join columns (for many-to-one and one-to-one owner)
entityMetadata.relations.filter(function (relation) { return relation.isOneToOne || relation.isManyToOne; }).forEach(function (relation) {
var joinColumns = _this.metadataArgsStorage.filterJoinColumns(relation.target, relation.propertyName);
var _a = _this.relationJoinColumnBuilder.build(joinColumns, relation), foreignKey = _a.foreignKey, columns = _a.columns, uniqueConstraint = _a.uniqueConstraint; // create a foreign key based on its metadata args
if (foreignKey) {
relation.registerForeignKeys(foreignKey); // push it to the relation and thus register there a join column
entityMetadata.foreignKeys.push(foreignKey);
}
if (columns) {
relation.registerJoinColumns(columns);
}
if (uniqueConstraint) {
if (_this.connection.driver instanceof MysqlDriver_1.MysqlDriver || _this.connection.driver instanceof AuroraDataApiDriver_1.AuroraDataApiDriver
|| _this.connection.driver instanceof SqlServerDriver_1.SqlServerDriver || _this.connection.driver instanceof SapDriver_1.SapDriver) {
var index = new IndexMetadata_1.IndexMetadata({
entityMetadata: uniqueConstraint.entityMetadata,
columns: uniqueConstraint.columns,
args: {
target: uniqueConstraint.target,
name: uniqueConstraint.name,
unique: true,
synchronize: true
}
});
if (_this.connection.driver instanceof SqlServerDriver_1.SqlServerDriver) {
index.where = index.columns.map(function (column) {
return _this.connection.driver.escape(column.databaseName) + " IS NOT NULL";
}).join(" AND ");
}
if (relation.embeddedMetadata) {
relation.embeddedMetadata.indices.push(index);
}
else {
relation.entityMetadata.ownIndices.push(index);
}
_this.computeEntityMetadataStep2(entityMetadata);
}
else {
if (relation.embeddedMetadata) {
relation.embeddedMetadata.uniques.push(uniqueConstraint);
}
else {
relation.entityMetadata.ownUniques.push(uniqueConstraint);
}
_this.computeEntityMetadataStep2(entityMetadata);
}
}
if (foreignKey && _this.connection.driver instanceof CockroachDriver_1.CockroachDriver) {
var index = new IndexMetadata_1.IndexMetadata({
entityMetadata: relation.entityMetadata,
columns: foreignKey.columns,
args: {
target: relation.entityMetadata.target,
synchronize: true
}
});
if (relation.embeddedMetadata) {
relation.embeddedMetadata.indices.push(index);
}
else {
relation.entityMetadata.ownIndices.push(index);
}
_this.computeEntityMetadataStep2(entityMetadata);
}
});
// create junction entity metadatas for entity many-to-many relations
entityMetadata.relations.filter(function (relation) { return relation.isManyToMany; }).forEach(function (relation) {
var joinTable = _this.metadataArgsStorage.findJoinTable(relation.target, relation.propertyName);
if (!joinTable)
return; // no join table set - no need to do anything (it means this is many-to-many inverse side)
// here we create a junction entity metadata for a new junction table of many-to-many relation
var junctionEntityMetadata = _this.junctionEntityMetadataBuilder.build(relation, joinTable);
relation.registerForeignKeys.apply(relation, tslib_1.__spreadArray([], tslib_1.__read(junctionEntityMetadata.foreignKeys)));
relation.registerJoinColumns(junctionEntityMetadata.ownIndices[0].columns, junctionEntityMetadata.ownIndices[1].columns);
relation.registerJunctionEntityMetadata(junctionEntityMetadata);
// compute new entity metadata properties and push it to entity metadatas pool
_this.computeEntityMetadataStep2(junctionEntityMetadata);
_this.computeInverseProperties(junctionEntityMetadata, entityMetadatas);
entityMetadatas.push(junctionEntityMetadata);
});
});
// update entity metadata depend properties
entityMetadatas
.forEach(function (entityMetadata) {
entityMetadata.relationsWithJoinColumns = entityMetadata.relations.filter(function (relation) { return relation.isWithJoinColumn; });
entityMetadata.hasNonNullableRelations = entityMetadata.relationsWithJoinColumns.some(function (relation) { return !relation.isNullable || relation.isPrimary; });
});
// generate closure junction tables for all closure tables
entityMetadatas
.filter(function (metadata) { return metadata.treeType === "closure-table"; })
.forEach(function (entityMetadata) {
var closureJunctionEntityMetadata = _this.closureJunctionEntityMetadataBuilder.build(entityMetadata);
entityMetadata.closureJunctionTable = closureJunctionEntityMetadata;
_this.computeEntityMetadataStep2(closureJunctionEntityMetadata);
_this.computeInverseProperties(closureJunctionEntityMetadata, entityMetadatas);
entityMetadatas.push(closureJunctionEntityMetadata);
});
// generate keys for tables with single-table inheritance
entityMetadatas
.filter(function (metadata) { return metadata.inheritancePattern === "STI" && metadata.discriminatorColumn; })
.forEach(function (entityMetadata) { return _this.createKeysForTableInheritance(entityMetadata); });
// build all indices (need to do it after relations and their join columns are built)
entityMetadatas.forEach(function (entityMetadata) {
entityMetadata.indices.forEach(function (index) { return index.build(_this.connection.namingStrategy); });
});
// build all unique constraints (need to do it after relations and their join columns are built)
entityMetadatas.forEach(function (entityMetadata) {
entityMetadata.uniques.forEach(function (unique) { return unique.build(_this.connection.namingStrategy); });
});
// build all check constraints
entityMetadatas.forEach(function (entityMetadata) {
entityMetadata.checks.forEach(function (check) { return check.build(_this.connection.namingStrategy); });
});
// build all exclusion constraints
entityMetadatas.forEach(function (entityMetadata) {
entityMetadata.exclusions.forEach(function (exclusion) { return exclusion.build(_this.connection.namingStrategy); });
});
// add lazy initializer for entity relations
entityMetadatas
.filter(function (metadata) { return metadata.target instanceof Function; })
.forEach(function (entityMetadata) {
entityMetadata.relations
.filter(function (relation) { return relation.isLazy; })
.forEach(function (relation) {
_this.connection.relationLoader.enableLazyLoad(relation, entityMetadata.target.prototype);
});
});
entityMetadatas.forEach(function (entityMetadata) {
entityMetadata.columns.forEach(function (column) {
// const target = column.embeddedMetadata ? column.embeddedMetadata.type : column.target;
var generated = _this.metadataArgsStorage.findGenerated(column.target, column.propertyName);
if (generated) {
column.isGenerated = true;
column.generationStrategy = generated.strategy;
if (generated.strategy === "uuid") {
column.type = "uuid";
}
else if (generated.strategy === "rowid") {
column.type = "int";
}
else {
column.type = column.type || Number;
}
column.build(_this.connection);
_this.computeEntityMetadataStep2(entityMetadata);
}
});
});
return entityMetadatas;
};
// -------------------------------------------------------------------------
// Protected Methods
// -------------------------------------------------------------------------
/**
* Creates entity metadata from the given table args.
* Creates column, relation, etc. metadatas for everything this entity metadata owns.
*/
EntityMetadataBuilder.prototype.createEntityMetadata = function (tableArgs) {
// we take all "inheritance tree" from a target entity to collect all stored metadata args
// (by decorators or inside entity schemas). For example for target Post < ContentModel < Unit
// it will be an array of [Post, ContentModel, Unit] and we can then get all metadata args of those classes
var inheritanceTree = tableArgs.target instanceof Function
? MetadataUtils_1.MetadataUtils.getInheritanceTree(tableArgs.target)
: [tableArgs.target]; // todo: implement later here inheritance for string-targets
var tableInheritance = this.metadataArgsStorage.findInheritanceType(tableArgs.target);
var tableTree = this.metadataArgsStorage.findTree(tableArgs.target);
// if single table inheritance used, we need to copy all children columns in to parent table
var singleTableChildrenTargets;
if ((tableInheritance && tableInheritance.pattern === "STI") || tableArgs.type === "entity-child") {
singleTableChildrenTargets = this.metadataArgsStorage
.filterSingleTableChildren(tableArgs.target)
.map(function (args) { return args.target; })
.filter(function (target) { return target instanceof Function; });
inheritanceTree.push.apply(inheritanceTree, tslib_1.__spreadArray([], tslib_1.__read(singleTableChildrenTargets)));
}
return new EntityMetadata_1.EntityMetadata({
connection: this.connection,
args: tableArgs,
inheritanceTree: inheritanceTree,
tableTree: tableTree,
inheritancePattern: tableInheritance ? tableInheritance.pattern : undefined
});
};
EntityMetadataBuilder.prototype.computeParentEntityMetadata = function (allEntityMetadatas, entityMetadata) {
// after all metadatas created we set parent entity metadata for table inheritance
if (entityMetadata.tableType === "entity-child") {
entityMetadata.parentEntityMetadata = allEntityMetadatas.find(function (allEntityMetadata) {
return allEntityMetadata.inheritanceTree.indexOf(entityMetadata.target) !== -1 && allEntityMetadata.inheritancePattern === "STI";
});
}
};
EntityMetadataBuilder.prototype.computeEntityMetadataStep1 = function (allEntityMetadatas, entityMetadata) {
var _a, _b, _c;
var _this = this;
var entityInheritance = this.metadataArgsStorage.findInheritanceType(entityMetadata.target);
var discriminatorValue = this.metadataArgsStorage.findDiscriminatorValue(entityMetadata.target);
if (typeof discriminatorValue !== "undefined") {
entityMetadata.discriminatorValue = discriminatorValue.value;
}
else {
entityMetadata.discriminatorValue = entityMetadata.target.name;
}
// if single table inheritance is used, we need to mark all embedded columns as nullable
entityMetadata.embeddeds = this.createEmbeddedsRecursively(entityMetadata, this.metadataArgsStorage.filterEmbeddeds(entityMetadata.inheritanceTree))
.map(function (embedded) {
if (entityMetadata.inheritancePattern === "STI") {
embedded.columns = embedded.columns.map(function (column) {
column.isNullable = true;
return column;
});
}
return embedded;
});
entityMetadata.ownColumns = this.metadataArgsStorage
.filterColumns(entityMetadata.inheritanceTree)
.map(function (args) {
// for single table children we reuse columns created for their parents
if (entityMetadata.tableType === "entity-child")
return entityMetadata.parentEntityMetadata.ownColumns.find(function (column) { return column.propertyName === args.propertyName; });
var column = new ColumnMetadata_1.ColumnMetadata({ connection: _this.connection, entityMetadata: entityMetadata, args: args });
// if single table inheritance used, we need to mark all inherit table columns as nullable
var columnInSingleTableInheritedChild = allEntityMetadatas.find(function (otherEntityMetadata) { return otherEntityMetadata.tableType === "entity-child" && otherEntityMetadata.target === args.target; });
if (columnInSingleTableInheritedChild)
column.isNullable = true;
return column;
});
// for table inheritance we need to add a discriminator column
//
if (entityInheritance && entityInheritance.column) {
var discriminatorColumnName_1 = entityInheritance.column && entityInheritance.column.name ? entityInheritance.column.name : "type";
var discriminatorColumn = entityMetadata.ownColumns.find(function (column) { return column.propertyName === discriminatorColumnName_1; });
if (!discriminatorColumn) {
discriminatorColumn = new ColumnMetadata_1.ColumnMetadata({
connection: this.connection,
entityMetadata: entityMetadata,
args: {
target: entityMetadata.target,
mode: "virtual",
propertyName: discriminatorColumnName_1,
options: entityInheritance.column || {
name: discriminatorColumnName_1,
type: "varchar",
nullable: false
}
}
});
discriminatorColumn.isVirtual = true;
discriminatorColumn.isDiscriminator = true;
entityMetadata.ownColumns.push(discriminatorColumn);
}
else {
discriminatorColumn.isDiscriminator = true;
}
}
// add discriminator column to the child entity metadatas
// discriminator column will not be there automatically since we are creating it in the code above
if (entityMetadata.tableType === "entity-child") {
var discriminatorColumn_1 = entityMetadata.parentEntityMetadata.ownColumns.find(function (column) { return column.isDiscriminator; });
if (discriminatorColumn_1 && !entityMetadata.ownColumns.find(function (column) { return column === discriminatorColumn_1; })) {
entityMetadata.ownColumns.push(discriminatorColumn_1);
}
}
var namingStrategy = this.connection.namingStrategy;
// check if tree is used then we need to add extra columns for specific tree types
if (entityMetadata.treeType === "materialized-path") {
entityMetadata.ownColumns.push(new ColumnMetadata_1.ColumnMetadata({
connection: this.connection,
entityMetadata: entityMetadata,
materializedPath: true,
args: {
target: entityMetadata.target,
mode: "virtual",
propertyName: "mpath",
options: /*tree.column || */ {
name: namingStrategy.materializedPathColumnName,
type: "varchar",
nullable: true,
default: ""
}
}
}));
}
else if (entityMetadata.treeType === "nested-set") {
var _d = namingStrategy.nestedSetColumnNames, left = _d.left, right = _d.right;
entityMetadata.ownColumns.push(new ColumnMetadata_1.ColumnMetadata({
connection: this.connection,
entityMetadata: entityMetadata,
nestedSetLeft: true,
args: {
target: entityMetadata.target,
mode: "virtual",
propertyName: left,
options: /*tree.column || */ {
name: left,
type: "integer",
nullable: false,
default: 1
}
}
}));
entityMetadata.ownColumns.push(new ColumnMetadata_1.ColumnMetadata({
connection: this.connection,
entityMetadata: entityMetadata,
nestedSetRight: true,
args: {
target: entityMetadata.target,
mode: "virtual",
propertyName: right,
options: /*tree.column || */ {
name: right,
type: "integer",
nullable: false,
default: 2
}
}
}));
}
entityMetadata.ownRelations = this.metadataArgsStorage.filterRelations(entityMetadata.inheritanceTree).map(function (args) {
// for single table children we reuse relations created for their parents
if (entityMetadata.tableType === "entity-child") {
var parentRelation = entityMetadata.parentEntityMetadata.ownRelations.find(function (relation) { return relation.propertyName === args.propertyName; });
var type = args.type instanceof Function ? args.type() : args.type;
if (parentRelation.type !== type) {
var clone = Object.create(parentRelation);
clone.type = type;
return clone;
}
return parentRelation;
}
return new RelationMetadata_1.RelationMetadata({ entityMetadata: entityMetadata, args: args });
});
entityMetadata.relationIds = this.metadataArgsStorage.filterRelationIds(entityMetadata.inheritanceTree).map(function (args) {
// for single table children we reuse relation ids created for their parents
if (entityMetadata.tableType === "entity-child")
return entityMetadata.parentEntityMetadata.relationIds.find(function (relationId) { return relationId.propertyName === args.propertyName; });
return new RelationIdMetadata_1.RelationIdMetadata({ entityMetadata: entityMetadata, args: args });
});
entityMetadata.relationCounts = this.metadataArgsStorage.filterRelationCounts(entityMetadata.inheritanceTree).map(function (args) {
// for single table children we reuse relation counts created for their parents
if (entityMetadata.tableType === "entity-child")
return entityMetadata.parentEntityMetadata.relationCounts.find(function (relationCount) { return relationCount.propertyName === args.propertyName; });
return new RelationCountMetadata_1.RelationCountMetadata({ entityMetadata: entityMetadata, args: args });
});
entityMetadata.ownListeners = this.metadataArgsStorage.filterListeners(entityMetadata.inheritanceTree).map(function (args) {
return new EntityListenerMetadata_1.EntityListenerMetadata({ entityMetadata: entityMetadata, args: args });
});
entityMetadata.checks = this.metadataArgsStorage.filterChecks(entityMetadata.inheritanceTree).map(function (args) {
return new CheckMetadata_1.CheckMetadata({ entityMetadata: entityMetadata, args: args });
});
// Only PostgreSQL supports exclusion constraints.
if (this.connection.driver instanceof PostgresDriver_1.PostgresDriver) {
entityMetadata.exclusions = this.metadataArgsStorage.filterExclusions(entityMetadata.inheritanceTree).map(function (args) {
return new ExclusionMetadata_1.ExclusionMetadata({ entityMetadata: entityMetadata, args: args });
});
}
if (this.connection.driver instanceof CockroachDriver_1.CockroachDriver) {
entityMetadata.ownIndices = this.metadataArgsStorage.filterIndices(entityMetadata.inheritanceTree)
.filter(function (args) { return !args.unique; })
.map(function (args) {
return new IndexMetadata_1.IndexMetadata({ entityMetadata: entityMetadata, args: args });
});
var uniques = this.metadataArgsStorage.filterIndices(entityMetadata.inheritanceTree)
.filter(function (args) { return args.unique; })
.map(function (args) {
return new UniqueMetadata_1.UniqueMetadata({
entityMetadata: entityMetadata,
args: {
target: args.target,
name: args.name,
columns: args.columns,
}
});
});
(_a = entityMetadata.ownUniques).push.apply(_a, tslib_1.__spreadArray([], tslib_1.__read(uniques)));
}
else {
entityMetadata.ownIndices = this.metadataArgsStorage.filterIndices(entityMetadata.inheritanceTree).map(function (args) {
return new IndexMetadata_1.IndexMetadata({ entityMetadata: entityMetadata, args: args });
});
}
// Mysql and SAP HANA stores unique constraints as unique indices.
if (this.connection.driver instanceof MysqlDriver_1.MysqlDriver || this.connection.driver instanceof AuroraDataApiDriver_1.AuroraDataApiDriver || this.connection.driver instanceof SapDriver_1.SapDriver) {
var indices = this.metadataArgsStorage.filterUniques(entityMetadata.inheritanceTree).map(function (args) {
return new IndexMetadata_1.IndexMetadata({
entityMetadata: entityMetadata,
args: {
target: args.target,
name: args.name,
columns: args.columns,
unique: true,
synchronize: true
}
});
});
(_b = entityMetadata.ownIndices).push.apply(_b, tslib_1.__spreadArray([], tslib_1.__read(indices)));
}
else {
var uniques = this.metadataArgsStorage.filterUniques(entityMetadata.inheritanceTree).map(function (args) {
return new UniqueMetadata_1.UniqueMetadata({ entityMetadata: entityMetadata, args: args });
});
(_c = entityMetadata.ownUniques).push.apply(_c, tslib_1.__spreadArray([], tslib_1.__read(uniques)));
}
};
/**
* Creates from the given embedded metadata args real embedded metadatas with its columns and relations,
* and does the same for all its sub-embeddeds (goes recursively).
*/
EntityMetadataBuilder.prototype.createEmbeddedsRecursively = function (entityMetadata, embeddedArgs) {
var _this = this;
return embeddedArgs.map(function (embeddedArgs) {
var embeddedMetadata = new EmbeddedMetadata_1.EmbeddedMetadata({ entityMetadata: entityMetadata, args: embeddedArgs });
var targets = MetadataUtils_1.MetadataUtils.getInheritanceTree(embeddedMetadata.type);
embeddedMetadata.columns = _this.metadataArgsStorage.filterColumns(targets).map(function (args) {
return new ColumnMetadata_1.ColumnMetadata({ connection: _this.connection, entityMetadata: entityMetadata, embeddedMetadata: embeddedMetadata, args: args });
});
embeddedMetadata.relations = _this.metadataArgsStorage.filterRelations(targets).map(function (args) {
return new RelationMetadata_1.RelationMetadata({ entityMetadata: entityMetadata, embeddedMetadata: embeddedMetadata, args: args });
});
embeddedMetadata.listeners = _this.metadataArgsStorage.filterListeners(targets).map(function (args) {
return new EntityListenerMetadata_1.EntityListenerMetadata({ entityMetadata: entityMetadata, embeddedMetadata: embeddedMetadata, args: args });
});
embeddedMetadata.indices = _this.metadataArgsStorage.filterIndices(targets).map(function (args) {
return new IndexMetadata_1.IndexMetadata({ entityMetadata: entityMetadata, embeddedMetadata: embeddedMetadata, args: args });
});
embeddedMetadata.uniques = _this.metadataArgsStorage.filterUniques(targets).map(function (args) {
return new UniqueMetadata_1.UniqueMetadata({ entityMetadata: entityMetadata, embeddedMetadata: embeddedMetadata, args: args });
});
embeddedMetadata.relationIds = _this.metadataArgsStorage.filterRelationIds(targets).map(function (args) {
return new RelationIdMetadata_1.RelationIdMetadata({ entityMetadata: entityMetadata, args: args });
});
embeddedMetadata.relationCounts = _this.metadataArgsStorage.filterRelationCounts(targets).map(function (args) {
return new RelationCountMetadata_1.RelationCountMetadata({ entityMetadata: entityMetadata, args: args });
});
embeddedMetadata.embeddeds = _this.createEmbeddedsRecursively(entityMetadata, _this.metadataArgsStorage.filterEmbeddeds(targets));
embeddedMetadata.embeddeds.forEach(function (subEmbedded) { return subEmbedded.parentEmbeddedMetadata = embeddedMetadata; });
entityMetadata.allEmbeddeds.push(embeddedMetadata);
return embeddedMetadata;
});
};
/**
* Computes all entity metadata's computed properties, and all its sub-metadatas (relations, columns, embeds, etc).
*/
EntityMetadataBuilder.prototype.computeEntityMetadataStep2 = function (entityMetadata) {
var _this = this;
entityMetadata.embeddeds.forEach(function (embedded) { return embedded.build(_this.connection); });
entityMetadata.embeddeds.forEach(function (embedded) {
embedded.columnsFromTree.forEach(function (column) { return column.build(_this.connection); });
embedded.relationsFromTree.forEach(function (relation) { return relation.build(); });
});
entityMetadata.ownColumns.forEach(function (column) { return column.build(_this.connection); });
entityMetadata.ownRelations.forEach(function (relation) { return relation.build(); });
entityMetadata.relations = entityMetadata.embeddeds.reduce(function (relations, embedded) { return relations.concat(embedded.relationsFromTree); }, entityMetadata.ownRelations);
entityMetadata.eagerRelations = entityMetadata.relations.filter(function (relation) { return relation.isEager; });
entityMetadata.lazyRelations = entityMetadata.relations.filter(function (relation) { return relation.isLazy; });
entityMetadata.oneToOneRelations = entityMetadata.relations.filter(function (relation) { return relation.isOneToOne; });
entityMetadata.oneToManyRelations = entityMetadata.relations.filter(function (relation) { return relation.isOneToMany; });
entityMetadata.manyToOneRelations = entityMetadata.relations.filter(function (relation) { return relation.isManyToOne; });
entityMetadata.manyToManyRelations = entityMetadata.relations.filter(function (relation) { return relation.isManyToMany; });
entityMetadata.ownerOneToOneRelations = entityMetadata.relations.filter(function (relation) { return relation.isOneToOneOwner; });
entityMetadata.ownerManyToManyRelations = entityMetadata.relations.filter(function (relation) { return relation.isManyToManyOwner; });
entityMetadata.treeParentRelation = entityMetadata.relations.find(function (relation) { return relation.isTreeParent; });
entityMetadata.treeChildrenRelation = entityMetadata.relations.find(function (relation) { return relation.isTreeChildren; });
entityMetadata.columns = entityMetadata.embeddeds.reduce(function (columns, embedded) { return columns.concat(embedded.columnsFromTree); }, entityMetadata.ownColumns);
entityMetadata.listeners = entityMetadata.embeddeds.reduce(function (listeners, embedded) { return listeners.concat(embedded.listenersFromTree); }, entityMetadata.ownListeners);
entityMetadata.afterLoadListeners = entityMetadata.listeners.filter(function (listener) { return listener.type === EventListenerTypes_1.EventListenerTypes.AFTER_LOAD; });
entityMetadata.afterInsertListeners = entityMetadata.listeners.filter(function (listener) { return listener.type === EventListenerTypes_1.EventListenerTypes.AFTER_INSERT; });
entityMetadata.afterUpdateListeners = entityMetadata.listeners.filter(function (listener) { return listener.type === EventListenerTypes_1.EventListenerTypes.AFTER_UPDATE; });
entityMetadata.afterRemoveListeners = entityMetadata.listeners.filter(function (listener) { return listener.type === EventListenerTypes_1.EventListenerTypes.AFTER_REMOVE; });
entityMetadata.beforeInsertListeners = entityMetadata.listeners.filter(function (listener) { return listener.type === EventListenerTypes_1.EventListenerTypes.BEFORE_INSERT; });
entityMetadata.beforeUpdateListeners = entityMetadata.listeners.filter(function (listener) { return listener.type === EventListenerTypes_1.EventListenerTypes.BEFORE_UPDATE; });
entityMetadata.beforeRemoveListeners = entityMetadata.listeners.filter(function (listener) { return listener.type === EventListenerTypes_1.EventListenerTypes.BEFORE_REMOVE; });
entityMetadata.indices = entityMetadata.embeddeds.reduce(function (indices, embedded) { return indices.concat(embedded.indicesFromTree); }, entityMetadata.ownIndices);
entityMetadata.uniques = entityMetadata.embeddeds.reduce(function (uniques, embedded) { return uniques.concat(embedded.uniquesFromTree); }, entityMetadata.ownUniques);
entityMetadata.primaryColumns = entityMetadata.columns.filter(function (column) { return column.isPrimary; });
entityMetadata.nonVirtualColumns = entityMetadata.columns.filter(function (column) { return !column.isVirtual; });
entityMetadata.ancestorColumns = entityMetadata.columns.filter(function (column) { return column.closureType === "ancestor"; });
entityMetadata.descendantColumns = entityMetadata.columns.filter(function (column) { return column.closureType === "descendant"; });
entityMetadata.hasMultiplePrimaryKeys = entityMetadata.primaryColumns.length > 1;
entityMetadata.generatedColumns = entityMetadata.columns.filter(function (column) { return column.isGenerated || column.isObjectId; });
entityMetadata.hasUUIDGeneratedColumns = entityMetadata.columns.filter(function (column) { return column.isGenerated || column.generationStrategy === "uuid"; }).length > 0;
entityMetadata.createDateColumn = entityMetadata.columns.find(function (column) { return column.isCreateDate; });
entityMetadata.updateDateColumn = entityMetadata.columns.find(function (column) { return column.isUpdateDate; });
entityMetadata.deleteDateColumn = entityMetadata.columns.find(function (column) { return column.isDeleteDate; });
entityMetadata.versionColumn = entityMetadata.columns.find(function (column) { return column.isVersion; });
entityMetadata.discriminatorColumn = entityMetadata.columns.find(function (column) { return column.isDiscriminator; });
entityMetadata.treeLevelColumn = entityMetadata.columns.find(function (column) { return column.isTreeLevel; });
entityMetadata.nestedSetLeftColumn = entityMetadata.columns.find(function (column) { return column.isNestedSetLeft; });
entityMetadata.nestedSetRightColumn = entityMetadata.columns.find(function (column) { return column.isNestedSetRight; });
entityMetadata.materializedPathColumn = entityMetadata.columns.find(function (column) { return column.isMaterializedPath; });
entityMetadata.objectIdColumn = entityMetadata.columns.find(function (column) { return column.isObjectId; });
entityMetadata.foreignKeys.forEach(function (foreignKey) { return foreignKey.build(_this.connection.namingStrategy); });
entityMetadata.propertiesMap = entityMetadata.createPropertiesMap();
entityMetadata.relationIds.forEach(function (relationId) { return relationId.build(); });
entityMetadata.relationCounts.forEach(function (relationCount) { return relationCount.build(); });
entityMetadata.embeddeds.forEach(function (embedded) {
embedded.relationIdsFromTree.forEach(function (relationId) { return relationId.build(); });
embedded.relationCountsFromTree.forEach(function (relationCount) { return relationCount.build(); });
});
};
/**
* Computes entity metadata's relations inverse side properties.
*/
EntityMetadataBuilder.prototype.computeInverseProperties = function (entityMetadata, entityMetadatas) {
entityMetadata.relations.forEach(function (relation) {
// compute inverse side (related) entity metadatas for all relation metadatas
var inverseEntityMetadata = entityMetadatas.find(function (m) { return m.target === relation.type || (typeof relation.type === "string" && (m.targetName === relation.type || m.givenTableName === relation.type)); });
if (!inverseEntityMetadata)
throw new error_1.TypeORMError("Entity metadata for " + entityMetadata.name + "#" + relation.propertyPath + " was not found. Check if you specified a correct entity object and if it's connected in the connection options.");
relation.inverseEntityMetadata = inverseEntityMetadata;
relation.inverseSidePropertyPath = relation.buildInverseSidePropertyPath();
// and compute inverse relation and mark if it has such
relation.inverseRelation = inverseEntityMetadata.relations.find(function (foundRelation) { return foundRelation.propertyPath === relation.inverseSidePropertyPath; });
});
};
/**
* Creates indices for the table of single table inheritance.
*/
EntityMetadataBuilder.prototype.createKeysForTableInheritance = function (entityMetadata) {
entityMetadata.indices.push(new IndexMetadata_1.IndexMetadata({
entityMetadata: entityMetadata,
columns: [entityMetadata.discriminatorColumn],
args: {
target: entityMetadata.target,
unique: false
}
}));
};
return EntityMetadataBuilder;
}());
exports.EntityMetadataBuilder = EntityMetadataBuilder;
//# sourceMappingURL=EntityMetadataBuilder.js.map