typeorm
Version:
Data-Mapper ORM for TypeScript and ES2021+. Supports MySQL/MariaDB, PostgreSQL, MS SQL Server, Oracle, SAP HANA, SQLite, MongoDB databases.
160 lines (158 loc) • 7.38 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ClosureJunctionEntityMetadataBuilder = void 0;
const EntityMetadata_1 = require("../metadata/EntityMetadata");
const ColumnMetadata_1 = require("../metadata/ColumnMetadata");
const ForeignKeyMetadata_1 = require("../metadata/ForeignKeyMetadata");
const IndexMetadata_1 = require("../metadata/IndexMetadata");
/**
* Creates EntityMetadata for junction tables of the closure entities.
* Closure junction tables are tables generated by closure entities.
*/
class ClosureJunctionEntityMetadataBuilder {
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
constructor(connection) {
this.connection = connection;
}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* Builds EntityMetadata for the closure junction of the given closure entity.
*/
build(parentClosureEntityMetadata) {
// create entity metadata itself
const 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((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,
unsigned: primaryColumn.unsigned,
width: primaryColumn.width,
precision: primaryColumn.precision,
scale: primaryColumn.scale,
zerofill: primaryColumn.zerofill,
charset: primaryColumn.charset,
collation: primaryColumn.collation,
},
},
}));
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,
unsigned: primaryColumn.unsigned,
width: primaryColumn.width,
precision: primaryColumn.precision,
scale: primaryColumn.scale,
zerofill: primaryColumn.zerofill,
charset: primaryColumn.charset,
collation: primaryColumn.collation,
},
},
}));
});
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.options.type === "mssql"
? "NO ACTION"
: "CASCADE",
}),
new ForeignKeyMetadata_1.ForeignKeyMetadata({
entityMetadata: entityMetadata,
referencedEntityMetadata: parentClosureEntityMetadata,
columns: [entityMetadata.ownColumns[1]],
referencedColumns: parentClosureEntityMetadata.primaryColumns,
onDelete: this.connection.driver.options.type === "mssql"
? "NO ACTION"
: "CASCADE",
}),
];
return entityMetadata;
}
}
exports.ClosureJunctionEntityMetadataBuilder = ClosureJunctionEntityMetadataBuilder;
//# sourceMappingURL=ClosureJunctionEntityMetadataBuilder.js.map