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
JavaScript
"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