mirror of
https://github.com/typeorm/typeorm.git
synced 2025-12-08 21:26:23 +00:00
refactoring entity metadata builder stuff
This commit is contained in:
parent
46a24cec0c
commit
39c6ef7eb7
@ -675,9 +675,8 @@ export class Connection {
|
||||
this.repositoryAggregators.length = 0;
|
||||
this.entityMetadatas.length = 0;
|
||||
|
||||
const namingStrategy = this.createNamingStrategy();
|
||||
this.driver.namingStrategy = namingStrategy;
|
||||
const lazyRelationsWrapper = this.createLazyRelationsWrapper();
|
||||
this.driver.namingStrategy = this.createNamingStrategy(); // todo: why they are in the driver
|
||||
this.driver.lazyRelationsWrapper = this.createLazyRelationsWrapper(); // todo: why they are in the driver
|
||||
const entityMetadataValidator = new EntityMetadataValidator();
|
||||
|
||||
// take imported event subscribers
|
||||
@ -699,7 +698,7 @@ export class Connection {
|
||||
.forEach(metadata => this.entityListeners.push(new EntityListenerMetadata(metadata)));
|
||||
|
||||
// build entity metadatas from metadata args storage (collected from decorators)
|
||||
new EntityMetadataBuilder(this.driver, lazyRelationsWrapper, getMetadataArgsStorage(), namingStrategy)
|
||||
new EntityMetadataBuilder(this, getMetadataArgsStorage())
|
||||
.build(this.entityClasses)
|
||||
.forEach(metadata => {
|
||||
this.entityMetadatas.push(metadata);
|
||||
@ -710,7 +709,7 @@ export class Connection {
|
||||
// build entity metadatas from given entity schemas
|
||||
if (this.entitySchemas && this.entitySchemas.length) {
|
||||
const metadataArgsStorage = getFromContainer(EntitySchemaTransformer).transform(this.entitySchemas);
|
||||
new EntityMetadataBuilder(this.driver, lazyRelationsWrapper, metadataArgsStorage, namingStrategy)
|
||||
new EntityMetadataBuilder(this, metadataArgsStorage)
|
||||
.build()
|
||||
.forEach(metadata => {
|
||||
this.entityMetadatas.push(metadata);
|
||||
|
||||
@ -3,6 +3,7 @@ import {QueryRunner} from "../query-runner/QueryRunner";
|
||||
import {ColumnMetadata} from "../metadata/ColumnMetadata";
|
||||
import {ObjectLiteral} from "../common/ObjectLiteral";
|
||||
import {NamingStrategyInterface} from "../naming-strategy/NamingStrategyInterface";
|
||||
import {LazyRelationsWrapper} from "../lazy-loading/LazyRelationsWrapper";
|
||||
|
||||
/**
|
||||
* Driver organizes TypeORM communication with specific database management system.
|
||||
@ -14,6 +15,11 @@ export interface Driver {
|
||||
*/
|
||||
namingStrategy: NamingStrategyInterface;
|
||||
|
||||
/**
|
||||
* Used to wrap lazy relations to be able to perform lazy loadings.
|
||||
*/
|
||||
lazyRelationsWrapper: LazyRelationsWrapper;
|
||||
|
||||
/**
|
||||
* Driver options contains connectivity options used to connection to the database.
|
||||
*/
|
||||
|
||||
@ -12,6 +12,7 @@ import {DriverOptionNotSetError} from "../error/DriverOptionNotSetError";
|
||||
import {PlatformTools} from "../../platform/PlatformTools";
|
||||
import {NamingStrategyInterface} from "../../naming-strategy/NamingStrategyInterface";
|
||||
import {EntityMetadata} from "../../metadata/EntityMetadata";
|
||||
import {LazyRelationsWrapper} from "../../lazy-loading/LazyRelationsWrapper";
|
||||
|
||||
/**
|
||||
* Organizes communication with MongoDB.
|
||||
@ -27,6 +28,11 @@ export class MongoDriver implements Driver {
|
||||
*/
|
||||
namingStrategy: NamingStrategyInterface;
|
||||
|
||||
/**
|
||||
* Used to wrap lazy relations to be able to perform lazy loadings.
|
||||
*/
|
||||
lazyRelationsWrapper: LazyRelationsWrapper;
|
||||
|
||||
/**
|
||||
* Mongodb does not require to dynamically create query runner each time,
|
||||
* because it does not have a regular pool.
|
||||
|
||||
@ -14,6 +14,7 @@ import {DriverOptionNotSetError} from "../error/DriverOptionNotSetError";
|
||||
import {DataTransformationUtils} from "../../util/DataTransformationUtils";
|
||||
import {PlatformTools} from "../../platform/PlatformTools";
|
||||
import {NamingStrategyInterface} from "../../naming-strategy/NamingStrategyInterface";
|
||||
import {LazyRelationsWrapper} from "../../lazy-loading/LazyRelationsWrapper";
|
||||
|
||||
/**
|
||||
* Organizes communication with MySQL DBMS.
|
||||
@ -29,6 +30,11 @@ export class MysqlDriver implements Driver {
|
||||
*/
|
||||
namingStrategy: NamingStrategyInterface;
|
||||
|
||||
/**
|
||||
* Used to wrap lazy relations to be able to perform lazy loadings.
|
||||
*/
|
||||
lazyRelationsWrapper: LazyRelationsWrapper;
|
||||
|
||||
/**
|
||||
* Driver connection options.
|
||||
*/
|
||||
|
||||
@ -14,6 +14,7 @@ import {DriverOptionNotSetError} from "../error/DriverOptionNotSetError";
|
||||
import {DataTransformationUtils} from "../../util/DataTransformationUtils";
|
||||
import {PlatformTools} from "../../platform/PlatformTools";
|
||||
import {NamingStrategyInterface} from "../../naming-strategy/NamingStrategyInterface";
|
||||
import {LazyRelationsWrapper} from "../../lazy-loading/LazyRelationsWrapper";
|
||||
|
||||
/**
|
||||
* Organizes communication with Oracle DBMS.
|
||||
@ -31,6 +32,11 @@ export class OracleDriver implements Driver {
|
||||
*/
|
||||
namingStrategy: NamingStrategyInterface;
|
||||
|
||||
/**
|
||||
* Used to wrap lazy relations to be able to perform lazy loadings.
|
||||
*/
|
||||
lazyRelationsWrapper: LazyRelationsWrapper;
|
||||
|
||||
/**
|
||||
* Driver connection options.
|
||||
*/
|
||||
|
||||
@ -14,6 +14,7 @@ import {DriverOptionNotSetError} from "../error/DriverOptionNotSetError";
|
||||
import {DataTransformationUtils} from "../../util/DataTransformationUtils";
|
||||
import {PlatformTools} from "../../platform/PlatformTools";
|
||||
import {NamingStrategyInterface} from "../../naming-strategy/NamingStrategyInterface";
|
||||
import {LazyRelationsWrapper} from "../../lazy-loading/LazyRelationsWrapper";
|
||||
|
||||
// todo(tests):
|
||||
// check connection with url
|
||||
@ -34,6 +35,11 @@ export class PostgresDriver implements Driver {
|
||||
*/
|
||||
namingStrategy: NamingStrategyInterface;
|
||||
|
||||
/**
|
||||
* Used to wrap lazy relations to be able to perform lazy loadings.
|
||||
*/
|
||||
lazyRelationsWrapper: LazyRelationsWrapper;
|
||||
|
||||
/**
|
||||
* Driver connection options.
|
||||
*/
|
||||
|
||||
@ -13,6 +13,7 @@ import {DriverOptionNotSetError} from "../error/DriverOptionNotSetError";
|
||||
import {DataTransformationUtils} from "../../util/DataTransformationUtils";
|
||||
import {PlatformTools} from "../../platform/PlatformTools";
|
||||
import {NamingStrategyInterface} from "../../naming-strategy/NamingStrategyInterface";
|
||||
import {LazyRelationsWrapper} from "../../lazy-loading/LazyRelationsWrapper";
|
||||
|
||||
/**
|
||||
* Organizes communication with sqlite DBMS.
|
||||
@ -28,6 +29,11 @@ export class SqliteDriver implements Driver {
|
||||
*/
|
||||
namingStrategy: NamingStrategyInterface;
|
||||
|
||||
/**
|
||||
* Used to wrap lazy relations to be able to perform lazy loadings.
|
||||
*/
|
||||
lazyRelationsWrapper: LazyRelationsWrapper;
|
||||
|
||||
/**
|
||||
* Driver connection options.
|
||||
*/
|
||||
|
||||
@ -14,6 +14,7 @@ import {DriverOptionNotSetError} from "../error/DriverOptionNotSetError";
|
||||
import {DataTransformationUtils} from "../../util/DataTransformationUtils";
|
||||
import {PlatformTools} from "../../platform/PlatformTools";
|
||||
import {NamingStrategyInterface} from "../../naming-strategy/NamingStrategyInterface";
|
||||
import {LazyRelationsWrapper} from "../../lazy-loading/LazyRelationsWrapper";
|
||||
|
||||
/**
|
||||
* Organizes communication with SQL Server DBMS.
|
||||
@ -29,6 +30,11 @@ export class SqlServerDriver implements Driver {
|
||||
*/
|
||||
namingStrategy: NamingStrategyInterface;
|
||||
|
||||
/**
|
||||
* Used to wrap lazy relations to be able to perform lazy loadings.
|
||||
*/
|
||||
lazyRelationsWrapper: LazyRelationsWrapper;
|
||||
|
||||
/**
|
||||
* Driver connection options.
|
||||
*/
|
||||
|
||||
@ -12,6 +12,7 @@ import {DriverOptionNotSetError} from "../error/DriverOptionNotSetError";
|
||||
import {DataTransformationUtils} from "../../util/DataTransformationUtils";
|
||||
import {WebsqlQueryRunner} from "./WebsqlQueryRunner";
|
||||
import {NamingStrategyInterface} from "../../naming-strategy/NamingStrategyInterface";
|
||||
import {LazyRelationsWrapper} from "../../lazy-loading/LazyRelationsWrapper";
|
||||
|
||||
/**
|
||||
* Declare a global function that is only available in browsers that support WebSQL.
|
||||
@ -32,6 +33,11 @@ export class WebsqlDriver implements Driver {
|
||||
*/
|
||||
namingStrategy: NamingStrategyInterface;
|
||||
|
||||
/**
|
||||
* Used to wrap lazy relations to be able to perform lazy loadings.
|
||||
*/
|
||||
lazyRelationsWrapper: LazyRelationsWrapper;
|
||||
|
||||
/**
|
||||
* Driver connection options.
|
||||
*/
|
||||
|
||||
@ -1,10 +1,8 @@
|
||||
import {EntityMetadata} from "../metadata/EntityMetadata";
|
||||
import {NamingStrategyInterface} from "../naming-strategy/NamingStrategyInterface";
|
||||
import {ColumnMetadata} from "../metadata/ColumnMetadata";
|
||||
import {ForeignKeyMetadata} from "../metadata/ForeignKeyMetadata";
|
||||
import {LazyRelationsWrapper} from "../lazy-loading/LazyRelationsWrapper";
|
||||
import {Driver} from "../driver/Driver";
|
||||
import {ColumnTypes} from "../metadata/types/ColumnTypes";
|
||||
import {Connection} from "../connection/Connection";
|
||||
|
||||
export class ClosureJunctionEntityMetadataBuilder {
|
||||
|
||||
@ -12,9 +10,7 @@ export class ClosureJunctionEntityMetadataBuilder {
|
||||
// Constructor
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
constructor(private driver: Driver,
|
||||
private lazyRelationsWrapper: LazyRelationsWrapper,
|
||||
private namingStrategy: NamingStrategyInterface) {
|
||||
constructor(private connection: Connection) {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
@ -24,9 +20,7 @@ export class ClosureJunctionEntityMetadataBuilder {
|
||||
build(parentClosureEntityMetadata: EntityMetadata) {
|
||||
const entityMetadata = new EntityMetadata({
|
||||
parentClosureEntityMetadata: parentClosureEntityMetadata,
|
||||
lazyRelationsWrapper: this.lazyRelationsWrapper,
|
||||
namingStrategy: this.namingStrategy,
|
||||
tablesPrefix: this.driver.options.tablesPrefix,
|
||||
connection: this.connection,
|
||||
args: {
|
||||
target: "",
|
||||
name: parentClosureEntityMetadata.tableNameWithoutPrefix,
|
||||
|
||||
@ -1,12 +1,9 @@
|
||||
import {EntityMetadata} from "../metadata/EntityMetadata";
|
||||
import {NamingStrategyInterface} from "../naming-strategy/NamingStrategyInterface";
|
||||
import {ColumnMetadata} from "../metadata/ColumnMetadata";
|
||||
import {IndexMetadata} from "../metadata/IndexMetadata";
|
||||
import {RelationMetadata} from "../metadata/RelationMetadata";
|
||||
import {EmbeddedMetadata} from "../metadata/EmbeddedMetadata";
|
||||
import {MetadataArgsStorage} from "../metadata-args/MetadataArgsStorage";
|
||||
import {LazyRelationsWrapper} from "../lazy-loading/LazyRelationsWrapper";
|
||||
import {Driver} from "../driver/Driver";
|
||||
import {EmbeddedMetadataArgs} from "../metadata-args/EmbeddedMetadataArgs";
|
||||
import {RelationIdMetadata} from "../metadata/RelationIdMetadata";
|
||||
import {RelationCountMetadata} from "../metadata/RelationCountMetadata";
|
||||
@ -15,19 +12,13 @@ import {TableMetadataArgs} from "../metadata-args/TableMetadataArgs";
|
||||
import {JunctionEntityMetadataBuilder} from "./JunctionEntityMetadataBuilder";
|
||||
import {ClosureJunctionEntityMetadataBuilder} from "./ClosureJunctionEntityMetadataBuilder";
|
||||
import {RelationJoinColumnBuilder} from "./RelationJoinColumnBuilder";
|
||||
import {Connection} from "../connection/Connection";
|
||||
|
||||
/**
|
||||
* Aggregates all metadata: table, column, relation into one collection grouped by tables for a given set of classes.
|
||||
*/
|
||||
export class EntityMetadataBuilder {
|
||||
|
||||
// todo: type in function validation, inverse side function validation
|
||||
// todo: check on build for duplicate names, since naming checking was removed from MetadataStorage
|
||||
// todo: duplicate name checking for: table, relation, column, index, naming strategy, join tables/columns?
|
||||
// todo: check if multiple tree parent metadatas in validator
|
||||
// todo: tree decorators can be used only on closure table (validation)
|
||||
// todo: throw error if parent tree metadata was not specified in a closure table
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Protected Properties
|
||||
// -------------------------------------------------------------------------
|
||||
@ -40,13 +31,10 @@ export class EntityMetadataBuilder {
|
||||
// Constructor
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
constructor(private driver: Driver,
|
||||
private lazyRelationsWrapper: LazyRelationsWrapper,
|
||||
private metadataArgsStorage: MetadataArgsStorage,
|
||||
private namingStrategy: NamingStrategyInterface) {
|
||||
this.junctionEntityMetadataBuilder = new JunctionEntityMetadataBuilder(driver, lazyRelationsWrapper, namingStrategy);
|
||||
this.closureJunctionEntityMetadataBuilder = new ClosureJunctionEntityMetadataBuilder(driver, lazyRelationsWrapper, namingStrategy);
|
||||
this.relationJoinColumnBuilder = new RelationJoinColumnBuilder(namingStrategy);
|
||||
constructor(private connection: Connection, private metadataArgsStorage: MetadataArgsStorage) {
|
||||
this.junctionEntityMetadataBuilder = new JunctionEntityMetadataBuilder(connection);
|
||||
this.closureJunctionEntityMetadataBuilder = new ClosureJunctionEntityMetadataBuilder(connection);
|
||||
this.relationJoinColumnBuilder = new RelationJoinColumnBuilder(connection);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
@ -132,7 +120,7 @@ export class EntityMetadataBuilder {
|
||||
entityMetadata.relations
|
||||
.filter(relation => relation.isLazy)
|
||||
.forEach(relation => {
|
||||
this.lazyRelationsWrapper.wrap((entityMetadata.target as Function).prototype, relation);
|
||||
this.connection.driver.lazyRelationsWrapper.wrap((entityMetadata.target as Function).prototype, relation);
|
||||
});
|
||||
});
|
||||
|
||||
@ -156,14 +144,8 @@ export class EntityMetadataBuilder {
|
||||
? MetadataUtils.getInheritanceTree(tableArgs.target)
|
||||
: [tableArgs.target]; // todo: implement later here inheritance for string-targets
|
||||
|
||||
const entityMetadata = new EntityMetadata({
|
||||
namingStrategy: this.namingStrategy,
|
||||
lazyRelationsWrapper: this.lazyRelationsWrapper,
|
||||
tablesPrefix: this.driver.options.tablesPrefix,
|
||||
args: tableArgs
|
||||
});
|
||||
const entityMetadata = new EntityMetadata({ connection: this.connection, args: tableArgs });
|
||||
entityMetadata.embeddeds = this.createEmbeddedsRecursively(entityMetadata, this.metadataArgsStorage.filterEmbeddeds(inheritanceTree));
|
||||
|
||||
entityMetadata.ownColumns = this.metadataArgsStorage.filterColumns(inheritanceTree).map(args => {
|
||||
return new ColumnMetadata({ entityMetadata, args });
|
||||
});
|
||||
@ -205,13 +187,13 @@ export class EntityMetadataBuilder {
|
||||
* Computes all entity metadata's computed properties, and all its sub-metadatas (relations, columns, embeds, etc).
|
||||
*/
|
||||
protected computeEntityMetadata(entityMetadata: EntityMetadata) {
|
||||
entityMetadata.embeddeds.forEach(embedded => embedded.build(this.namingStrategy));
|
||||
entityMetadata.embeddeds.forEach(embedded => embedded.build(this.connection.driver.namingStrategy));
|
||||
entityMetadata.embeddeds.forEach(embedded => {
|
||||
embedded.columnsFromTree.forEach(column => column.build(this.namingStrategy));
|
||||
embedded.relationsFromTree.forEach(relation => relation.build(this.namingStrategy));
|
||||
embedded.columnsFromTree.forEach(column => column.build(this.connection.driver.namingStrategy));
|
||||
embedded.relationsFromTree.forEach(relation => relation.build(this.connection.driver.namingStrategy));
|
||||
});
|
||||
entityMetadata.ownColumns.forEach(column => column.build(this.namingStrategy));
|
||||
entityMetadata.ownRelations.forEach(relation => relation.build(this.namingStrategy));
|
||||
entityMetadata.ownColumns.forEach(column => column.build(this.connection.driver.namingStrategy));
|
||||
entityMetadata.ownRelations.forEach(relation => relation.build(this.connection.driver.namingStrategy));
|
||||
entityMetadata.relations = entityMetadata.embeddeds.reduce((relations, embedded) => relations.concat(embedded.relationsFromTree), entityMetadata.ownRelations);
|
||||
entityMetadata.oneToOneRelations = entityMetadata.relations.filter(relation => relation.isOneToOne);
|
||||
entityMetadata.oneToManyRelations = entityMetadata.relations.filter(relation => relation.isOneToMany);
|
||||
@ -232,8 +214,8 @@ export class EntityMetadataBuilder {
|
||||
entityMetadata.treeLevelColumn = entityMetadata.columns.find(column => column.mode === "treeLevel")!; // todo: fix ! later
|
||||
entityMetadata.parentIdColumns = entityMetadata.columns.filter(column => column.mode === "parentId")!; // todo: fix ! later
|
||||
entityMetadata.objectIdColumn = entityMetadata.columns.find(column => column.mode === "objectId")!; // todo: fix ! later
|
||||
entityMetadata.foreignKeys.forEach(foreignKey => foreignKey.build(this.namingStrategy));
|
||||
entityMetadata.indices.forEach(index => index.build(this.namingStrategy));
|
||||
entityMetadata.foreignKeys.forEach(foreignKey => foreignKey.build(this.connection.driver.namingStrategy));
|
||||
entityMetadata.indices.forEach(index => index.build(this.connection.driver.namingStrategy));
|
||||
entityMetadata.propertiesMap = entityMetadata.createPropertiesMap();
|
||||
}
|
||||
|
||||
|
||||
@ -5,6 +5,12 @@ import {DepGraph} from "../util/DepGraph";
|
||||
|
||||
/// todo: add check if there are multiple tables with the same name
|
||||
/// todo: add checks when generated column / table names are too long for the specific driver
|
||||
// todo: type in function validation, inverse side function validation
|
||||
// todo: check on build for duplicate names, since naming checking was removed from MetadataStorage
|
||||
// todo: duplicate name checking for: table, relation, column, index, naming strategy, join tables/columns?
|
||||
// todo: check if multiple tree parent metadatas in validator
|
||||
// todo: tree decorators can be used only on closure table (validation)
|
||||
// todo: throw error if parent tree metadata was not specified in a closure table
|
||||
|
||||
/**
|
||||
* Validates built entity metadatas.
|
||||
|
||||
@ -1,12 +1,10 @@
|
||||
import {EntityMetadata} from "../metadata/EntityMetadata";
|
||||
import {NamingStrategyInterface} from "../naming-strategy/NamingStrategyInterface";
|
||||
import {ColumnMetadata} from "../metadata/ColumnMetadata";
|
||||
import {ForeignKeyMetadata} from "../metadata/ForeignKeyMetadata";
|
||||
import {IndexMetadata} from "../metadata/IndexMetadata";
|
||||
import {RelationMetadata} from "../metadata/RelationMetadata";
|
||||
import {LazyRelationsWrapper} from "../lazy-loading/LazyRelationsWrapper";
|
||||
import {Driver} from "../driver/Driver";
|
||||
import {JoinTableMetadataArgs} from "../metadata-args/JoinTableMetadataArgs";
|
||||
import {Connection} from "../connection/Connection";
|
||||
|
||||
export class JunctionEntityMetadataBuilder {
|
||||
|
||||
@ -14,9 +12,7 @@ export class JunctionEntityMetadataBuilder {
|
||||
// Constructor
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
constructor(private driver: Driver,
|
||||
private lazyRelationsWrapper: LazyRelationsWrapper,
|
||||
private namingStrategy: NamingStrategyInterface) {
|
||||
constructor(private connection: Connection) {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
@ -27,7 +23,7 @@ export class JunctionEntityMetadataBuilder {
|
||||
const referencedColumns = this.collectRelationReferencedColumns(relation, joinTable);
|
||||
const inverseReferencedColumns = this.collectRelationInverseReferencedColumns(relation, joinTable);
|
||||
|
||||
const joinTableName = joinTable.name || this.namingStrategy.joinTableName(
|
||||
const joinTableName = joinTable.name || this.connection.driver.namingStrategy.joinTableName(
|
||||
relation.entityMetadata.tableNameWithoutPrefix,
|
||||
relation.inverseEntityMetadata.tableNameWithoutPrefix,
|
||||
relation.propertyPath,
|
||||
@ -35,9 +31,7 @@ export class JunctionEntityMetadataBuilder {
|
||||
);
|
||||
|
||||
const entityMetadata = new EntityMetadata({
|
||||
lazyRelationsWrapper: this.lazyRelationsWrapper,
|
||||
namingStrategy: this.namingStrategy,
|
||||
tablesPrefix: this.driver.options.tablesPrefix,
|
||||
connection: this.connection,
|
||||
args: {
|
||||
target: "",
|
||||
name: joinTableName,
|
||||
@ -49,7 +43,7 @@ export class JunctionEntityMetadataBuilder {
|
||||
return (!joinColumnArgs.referencedColumnName || joinColumnArgs.referencedColumnName === referencedColumn.propertyName) &&
|
||||
!!joinColumnArgs.name;
|
||||
}) : undefined;
|
||||
const columnName = joinColumn && joinColumn.name ? joinColumn.name : this.namingStrategy.joinTableColumnName(relation.entityMetadata.tableNameWithoutPrefix, referencedColumn.propertyName, referencedColumn.givenDatabaseName);
|
||||
const columnName = joinColumn && joinColumn.name ? joinColumn.name : this.connection.driver.namingStrategy.joinTableColumnName(relation.entityMetadata.tableNameWithoutPrefix, referencedColumn.propertyName, referencedColumn.givenDatabaseName);
|
||||
|
||||
return new ColumnMetadata({
|
||||
entityMetadata: entityMetadata,
|
||||
@ -74,7 +68,7 @@ export class JunctionEntityMetadataBuilder {
|
||||
return (!joinColumnArgs.referencedColumnName || joinColumnArgs.referencedColumnName === inverseReferencedColumn.propertyName) &&
|
||||
!!joinColumnArgs.name;
|
||||
}) : undefined;
|
||||
const columnName = joinColumn && joinColumn.name ? joinColumn.name : this.namingStrategy.joinTableColumnName(relation.inverseEntityMetadata.tableNameWithoutPrefix, inverseReferencedColumn.propertyName, inverseReferencedColumn.givenDatabaseName);
|
||||
const columnName = joinColumn && joinColumn.name ? joinColumn.name : this.connection.driver.namingStrategy.joinTableColumnName(relation.inverseEntityMetadata.tableNameWithoutPrefix, inverseReferencedColumn.propertyName, inverseReferencedColumn.givenDatabaseName);
|
||||
|
||||
return new ColumnMetadata({
|
||||
entityMetadata: entityMetadata,
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
import {NamingStrategyInterface} from "../naming-strategy/NamingStrategyInterface";
|
||||
import {ColumnMetadata} from "../metadata/ColumnMetadata";
|
||||
import {ForeignKeyMetadata} from "../metadata/ForeignKeyMetadata";
|
||||
import {RelationMetadata} from "../metadata/RelationMetadata";
|
||||
import {JoinColumnMetadataArgs} from "../metadata-args/JoinColumnMetadataArgs";
|
||||
import {Connection} from "../connection/Connection";
|
||||
|
||||
// cases it should cover:
|
||||
// 1. when join column is set with custom name and without referenced column name
|
||||
@ -32,7 +32,7 @@ export class RelationJoinColumnBuilder {
|
||||
// Constructor
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
constructor(private namingStrategy: NamingStrategyInterface) {
|
||||
constructor(private connection: Connection) {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
@ -48,7 +48,7 @@ export class RelationJoinColumnBuilder {
|
||||
return new ForeignKeyMetadata({
|
||||
entityMetadata: relation.entityMetadata,
|
||||
referencedEntityMetadata: relation.inverseEntityMetadata,
|
||||
namingStrategy: this.namingStrategy,
|
||||
namingStrategy: this.connection.driver.namingStrategy,
|
||||
columns: columns,
|
||||
referencedColumns: referencedColumns,
|
||||
onDelete: relation.onDelete,
|
||||
@ -85,7 +85,7 @@ export class RelationJoinColumnBuilder {
|
||||
return (!joinColumn.referencedColumnName || joinColumn.referencedColumnName === referencedColumn.propertyName) &&
|
||||
!!joinColumn.name;
|
||||
});
|
||||
const joinColumnName = joinColumnMetadataArg ? joinColumnMetadataArg.name : this.namingStrategy.joinColumnName(relation.propertyName, referencedColumn.propertyName);
|
||||
const joinColumnName = joinColumnMetadataArg ? joinColumnMetadataArg.name : this.connection.driver.namingStrategy.joinColumnName(relation.propertyName, referencedColumn.propertyName);
|
||||
|
||||
let relationalColumn = relation.entityMetadata.ownColumns.find(column => column.databaseName === joinColumnName);
|
||||
if (!relationalColumn) {
|
||||
@ -103,7 +103,7 @@ export class RelationJoinColumnBuilder {
|
||||
}
|
||||
}
|
||||
});
|
||||
relationalColumn.build(this.namingStrategy);
|
||||
relationalColumn.build(this.connection.driver.namingStrategy);
|
||||
relation.entityMetadata.registerColumn(relationalColumn);
|
||||
}
|
||||
relationalColumn.referencedColumn = referencedColumn; // its important to set it here because we need to set referenced column for user defined join column
|
||||
|
||||
@ -12,6 +12,7 @@ import {OrderByCondition} from "../find-options/OrderByCondition";
|
||||
import {OrmUtils} from "../util/OrmUtils";
|
||||
import {NamingStrategyInterface} from "../naming-strategy/NamingStrategyInterface";
|
||||
import {TableMetadataArgs} from "../metadata-args/TableMetadataArgs";
|
||||
import {Connection} from "../connection/Connection";
|
||||
|
||||
/**
|
||||
* Contains all entity metadata.
|
||||
@ -320,13 +321,13 @@ export class EntityMetadata {
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
constructor(options: {
|
||||
namingStrategy: NamingStrategyInterface,
|
||||
lazyRelationsWrapper: LazyRelationsWrapper,
|
||||
connection: Connection,
|
||||
parentClosureEntityMetadata?: EntityMetadata,
|
||||
tablesPrefix?: string,
|
||||
args: TableMetadataArgs
|
||||
}) {
|
||||
this.lazyRelationsWrapper = options.lazyRelationsWrapper;
|
||||
const namingStrategy = options.connection.driver.namingStrategy;
|
||||
const tablesPrefix = options.connection.driver.options.tablesPrefix;
|
||||
this.lazyRelationsWrapper = options.connection.driver.lazyRelationsWrapper;
|
||||
this.parentClosureEntityMetadata = options.parentClosureEntityMetadata!;
|
||||
this.target = options.args.target;
|
||||
this.tableType = options.args.type;
|
||||
@ -334,10 +335,8 @@ export class EntityMetadata {
|
||||
this.givenTableName = options.args.name;
|
||||
this.skipSchemaSync = options.args.skipSchemaSync || false;
|
||||
this.targetName = options.args.target instanceof Function ? (options.args.target as any).name : options.args.target;
|
||||
this.tableNameWithoutPrefix = this.tableType === "closure-junction"
|
||||
? options.namingStrategy.closureJunctionTableName(this.givenTableName!)
|
||||
: options.namingStrategy.tableName(this.targetName, this.givenTableName);
|
||||
this.tableName = options.tablesPrefix ? options.namingStrategy.prefixTableName(options.tablesPrefix, this.tableNameWithoutPrefix) : this.tableNameWithoutPrefix;
|
||||
this.tableNameWithoutPrefix = this.tableType === "closure-junction" ? namingStrategy.closureJunctionTableName(this.givenTableName!) : namingStrategy.tableName(this.targetName, this.givenTableName);
|
||||
this.tableName = tablesPrefix ? namingStrategy.prefixTableName(tablesPrefix, this.tableNameWithoutPrefix) : this.tableNameWithoutPrefix;
|
||||
this.target = this.target ? this.target : this.tableName;
|
||||
this.name = this.targetName ? this.targetName : this.tableName;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user