UNPKG

typeorm

Version:

Data-Mapper ORM for TypeScript, ES7, ES6, ES5. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, MongoDB databases.

132 lines (130 loc) 6.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ClosureJunctionEntityMetadataBuilder = void 0; var EntityMetadata_1 = require("../metadata/EntityMetadata"); var ColumnMetadata_1 = require("../metadata/ColumnMetadata"); var ForeignKeyMetadata_1 = require("../metadata/ForeignKeyMetadata"); var IndexMetadata_1 = require("../metadata/IndexMetadata"); var SqlServerDriver_1 = require("../driver/sqlserver/SqlServerDriver"); /** * Creates EntityMetadata for junction tables of the closure entities. * Closure junction tables are tables generated by closure entities. */ var ClosureJunctionEntityMetadataBuilder = /** @class */ (function () { // ------------------------------------------------------------------------- // Constructor // ------------------------------------------------------------------------- function ClosureJunctionEntityMetadataBuilder(connection) { this.connection = connection; } // ------------------------------------------------------------------------- // Public Methods // ------------------------------------------------------------------------- /** * Builds EntityMetadata for the closure junction of the given closure entity. */ ClosureJunctionEntityMetadataBuilder.prototype.build = function (parentClosureEntityMetadata) { var _this = this; // create entity metadata itself var entityMetadata = new EntityMetadata_1.EntityMetadata({ parentClosureEntityMetadata: parentClosureEntityMetadata, connection: this.connection, args: { target: "", name: parentClosureEntityMetadata.treeOptions && parentClosureEntityMetadata.treeOptions.closureTableName ? parentClosureEntityMetadata.treeOptions.closureTableName : parentClosureEntityMetadata.tableNameWithoutPrefix, type: "closure-junction" } }); entityMetadata.build(); // create ancestor and descendant columns for new closure junction table parentClosureEntityMetadata.primaryColumns.forEach(function (primaryColumn) { entityMetadata.ownColumns.push(new ColumnMetadata_1.ColumnMetadata({ connection: _this.connection, entityMetadata: entityMetadata, closureType: "ancestor", referencedColumn: primaryColumn, args: { target: "", mode: "virtual", propertyName: parentClosureEntityMetadata.treeOptions && parentClosureEntityMetadata.treeOptions.ancestorColumnName ? parentClosureEntityMetadata.treeOptions.ancestorColumnName(primaryColumn) : primaryColumn.propertyName + "_ancestor", options: { primary: true, length: primaryColumn.length, type: primaryColumn.type } } })); entityMetadata.ownColumns.push(new ColumnMetadata_1.ColumnMetadata({ connection: _this.connection, entityMetadata: entityMetadata, closureType: "descendant", referencedColumn: primaryColumn, args: { target: "", mode: "virtual", propertyName: parentClosureEntityMetadata.treeOptions && parentClosureEntityMetadata.treeOptions.descendantColumnName ? parentClosureEntityMetadata.treeOptions.descendantColumnName(primaryColumn) : primaryColumn.propertyName + "_descendant", options: { primary: true, length: primaryColumn.length, type: primaryColumn.type, } } })); }); entityMetadata.ownIndices = [ new IndexMetadata_1.IndexMetadata({ entityMetadata: entityMetadata, columns: [entityMetadata.ownColumns[0]], args: { target: entityMetadata.target, synchronize: true } }), new IndexMetadata_1.IndexMetadata({ entityMetadata: entityMetadata, columns: [entityMetadata.ownColumns[1]], args: { target: entityMetadata.target, synchronize: true } }) ]; // if tree level column was defined by a closure entity then add it to the junction columns as well if (parentClosureEntityMetadata.treeLevelColumn) { entityMetadata.ownColumns.push(new ColumnMetadata_1.ColumnMetadata({ connection: this.connection, entityMetadata: entityMetadata, args: { target: "", mode: "virtual", propertyName: "level", options: { type: this.connection.driver.mappedDataTypes.treeLevel, } } })); } // create junction table foreign keys // Note: CASCADE is not applied to mssql because it does not support multi cascade paths entityMetadata.foreignKeys = [ new ForeignKeyMetadata_1.ForeignKeyMetadata({ entityMetadata: entityMetadata, referencedEntityMetadata: parentClosureEntityMetadata, columns: [entityMetadata.ownColumns[0]], referencedColumns: parentClosureEntityMetadata.primaryColumns, onDelete: this.connection.driver instanceof SqlServerDriver_1.SqlServerDriver ? "NO ACTION" : "CASCADE" }), new ForeignKeyMetadata_1.ForeignKeyMetadata({ entityMetadata: entityMetadata, referencedEntityMetadata: parentClosureEntityMetadata, columns: [entityMetadata.ownColumns[1]], referencedColumns: parentClosureEntityMetadata.primaryColumns, onDelete: this.connection.driver instanceof SqlServerDriver_1.SqlServerDriver ? "NO ACTION" : "CASCADE" }), ]; return entityMetadata; }; return ClosureJunctionEntityMetadataBuilder; }()); exports.ClosureJunctionEntityMetadataBuilder = ClosureJunctionEntityMetadataBuilder; //# sourceMappingURL=ClosureJunctionEntityMetadataBuilder.js.map