From 39c6ef7eb751a7faf23e31f1d6832c8c8c335b3c Mon Sep 17 00:00:00 2001 From: Umed Khudoiberdiev Date: Tue, 16 May 2017 11:07:44 +0500 Subject: [PATCH] refactoring entity metadata builder stuff --- src/connection/Connection.ts | 9 ++-- src/driver/Driver.ts | 6 +++ src/driver/mongodb/MongoDriver.ts | 6 +++ src/driver/mysql/MysqlDriver.ts | 6 +++ src/driver/oracle/OracleDriver.ts | 6 +++ src/driver/postgres/PostgresDriver.ts | 6 +++ src/driver/sqlite/SqliteDriver.ts | 6 +++ src/driver/sqlserver/SqlServerDriver.ts | 6 +++ src/driver/websql/WebsqlDriver.ts | 6 +++ .../ClosureJunctionEntityMetadataBuilder.ts | 12 ++--- src/metadata-builder/EntityMetadataBuilder.ts | 46 ++++++------------- .../EntityMetadataValidator.ts | 6 +++ .../JunctionEntityMetadataBuilder.ts | 18 +++----- .../RelationJoinColumnBuilder.ts | 10 ++-- src/metadata/EntityMetadata.ts | 15 +++--- 15 files changed, 93 insertions(+), 71 deletions(-) diff --git a/src/connection/Connection.ts b/src/connection/Connection.ts index 83a755b3c..a75dbddbf 100644 --- a/src/connection/Connection.ts +++ b/src/connection/Connection.ts @@ -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); diff --git a/src/driver/Driver.ts b/src/driver/Driver.ts index a7cb7601d..2ec85ac42 100644 --- a/src/driver/Driver.ts +++ b/src/driver/Driver.ts @@ -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. */ diff --git a/src/driver/mongodb/MongoDriver.ts b/src/driver/mongodb/MongoDriver.ts index a2450c594..1c9fda5a3 100644 --- a/src/driver/mongodb/MongoDriver.ts +++ b/src/driver/mongodb/MongoDriver.ts @@ -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. diff --git a/src/driver/mysql/MysqlDriver.ts b/src/driver/mysql/MysqlDriver.ts index 0ef566d56..d6c12c3b2 100644 --- a/src/driver/mysql/MysqlDriver.ts +++ b/src/driver/mysql/MysqlDriver.ts @@ -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. */ diff --git a/src/driver/oracle/OracleDriver.ts b/src/driver/oracle/OracleDriver.ts index 58b3b6bdb..c69897fb7 100644 --- a/src/driver/oracle/OracleDriver.ts +++ b/src/driver/oracle/OracleDriver.ts @@ -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. */ diff --git a/src/driver/postgres/PostgresDriver.ts b/src/driver/postgres/PostgresDriver.ts index e9bd08993..eaf4bf399 100644 --- a/src/driver/postgres/PostgresDriver.ts +++ b/src/driver/postgres/PostgresDriver.ts @@ -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. */ diff --git a/src/driver/sqlite/SqliteDriver.ts b/src/driver/sqlite/SqliteDriver.ts index 557cf8447..1e51d2ef3 100644 --- a/src/driver/sqlite/SqliteDriver.ts +++ b/src/driver/sqlite/SqliteDriver.ts @@ -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. */ diff --git a/src/driver/sqlserver/SqlServerDriver.ts b/src/driver/sqlserver/SqlServerDriver.ts index 96c653713..44bc311a2 100644 --- a/src/driver/sqlserver/SqlServerDriver.ts +++ b/src/driver/sqlserver/SqlServerDriver.ts @@ -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. */ diff --git a/src/driver/websql/WebsqlDriver.ts b/src/driver/websql/WebsqlDriver.ts index 5a4f466e5..f8dd05c0d 100644 --- a/src/driver/websql/WebsqlDriver.ts +++ b/src/driver/websql/WebsqlDriver.ts @@ -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. */ diff --git a/src/metadata-builder/ClosureJunctionEntityMetadataBuilder.ts b/src/metadata-builder/ClosureJunctionEntityMetadataBuilder.ts index 7470f49de..ced13bcea 100644 --- a/src/metadata-builder/ClosureJunctionEntityMetadataBuilder.ts +++ b/src/metadata-builder/ClosureJunctionEntityMetadataBuilder.ts @@ -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, diff --git a/src/metadata-builder/EntityMetadataBuilder.ts b/src/metadata-builder/EntityMetadataBuilder.ts index 675ffa00f..39a30d3a1 100644 --- a/src/metadata-builder/EntityMetadataBuilder.ts +++ b/src/metadata-builder/EntityMetadataBuilder.ts @@ -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(); } diff --git a/src/metadata-builder/EntityMetadataValidator.ts b/src/metadata-builder/EntityMetadataValidator.ts index 26cf1fce7..67353acb4 100644 --- a/src/metadata-builder/EntityMetadataValidator.ts +++ b/src/metadata-builder/EntityMetadataValidator.ts @@ -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. diff --git a/src/metadata-builder/JunctionEntityMetadataBuilder.ts b/src/metadata-builder/JunctionEntityMetadataBuilder.ts index 41b8e89f7..1218be96e 100644 --- a/src/metadata-builder/JunctionEntityMetadataBuilder.ts +++ b/src/metadata-builder/JunctionEntityMetadataBuilder.ts @@ -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, diff --git a/src/metadata-builder/RelationJoinColumnBuilder.ts b/src/metadata-builder/RelationJoinColumnBuilder.ts index ec3780a64..5b0d4a4d5 100644 --- a/src/metadata-builder/RelationJoinColumnBuilder.ts +++ b/src/metadata-builder/RelationJoinColumnBuilder.ts @@ -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 diff --git a/src/metadata/EntityMetadata.ts b/src/metadata/EntityMetadata.ts index d4c8b4512..2f8b3b40f 100644 --- a/src/metadata/EntityMetadata.ts +++ b/src/metadata/EntityMetadata.ts @@ -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;