typeorm 0.3.16-dev.f5b93c1 → 0.3.17-dev.abb9079
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/cli-ts-node-esm.js +4 -2
- package/browser/cli-ts-node-esm.js.map +1 -1
- package/browser/driver/Driver.d.ts +10 -0
- package/browser/driver/Driver.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachConnectionOptions.d.ts +8 -0
- package/browser/driver/cockroachdb/CockroachConnectionOptions.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachQueryRunner.d.ts +4 -0
- package/browser/driver/cockroachdb/CockroachQueryRunner.js +35 -18
- package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
- package/browser/driver/mongodb/MongoDriver.js +1 -1
- package/browser/driver/mongodb/MongoDriver.js.map +1 -1
- package/browser/driver/mysql/MysqlDriver.d.ts +8 -0
- package/browser/driver/mysql/MysqlDriver.js +30 -4
- package/browser/driver/mysql/MysqlDriver.js.map +1 -1
- package/browser/driver/oracle/OracleDriver.d.ts +13 -0
- package/browser/driver/oracle/OracleDriver.js +15 -0
- package/browser/driver/oracle/OracleDriver.js.map +1 -1
- package/browser/driver/oracle/OracleQueryRunner.js +4 -2
- package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
- package/browser/driver/sqlserver/SqlServerConnectionOptions.d.ts +9 -0
- package/browser/driver/sqlserver/SqlServerConnectionOptions.js.map +1 -1
- package/browser/driver/types/ColumnTypes.d.ts +1 -1
- package/browser/driver/types/ColumnTypes.js.map +1 -1
- package/browser/metadata/EntityMetadata.d.ts +10 -1
- package/browser/metadata/EntityMetadata.js +33 -7
- package/browser/metadata/EntityMetadata.js.map +1 -1
- package/browser/metadata-builder/EntityMetadataBuilder.js +15 -0
- package/browser/metadata-builder/EntityMetadataBuilder.js.map +1 -1
- package/browser/metadata-builder/EntityMetadataValidator.js +12 -0
- package/browser/metadata-builder/EntityMetadataValidator.js.map +1 -1
- package/browser/metadata-builder/JunctionEntityMetadataBuilder.js +4 -0
- package/browser/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
- package/browser/metadata-builder/RelationJoinColumnBuilder.js +2 -0
- package/browser/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
- package/browser/persistence/EntityPersistExecutor.js +3 -11
- package/browser/persistence/EntityPersistExecutor.js.map +1 -1
- package/browser/query-builder/RelationIdLoader.d.ts +3 -1
- package/browser/query-builder/RelationIdLoader.js +6 -5
- package/browser/query-builder/RelationIdLoader.js.map +1 -1
- package/browser/query-builder/SelectQueryBuilder.js +19 -3
- package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
- package/browser/query-builder/transformer/PlainObjectToNewEntityTransformer.js +10 -7
- package/browser/query-builder/transformer/PlainObjectToNewEntityTransformer.js.map +1 -1
- package/browser/query-builder/transformer/RawSqlResultsToEntityTransformer.js +1 -1
- package/browser/query-builder/transformer/RawSqlResultsToEntityTransformer.js.map +1 -1
- package/browser/util/DateUtils.d.ts +0 -12
- package/browser/util/DateUtils.js +16 -20
- package/browser/util/DateUtils.js.map +1 -1
- package/cli-ts-node-esm.js +4 -2
- package/cli-ts-node-esm.js.map +1 -1
- package/commands/InitCommand.js +1 -1
- package/commands/InitCommand.js.map +1 -1
- package/driver/Driver.d.ts +10 -0
- package/driver/Driver.js.map +1 -1
- package/driver/cockroachdb/CockroachConnectionOptions.d.ts +8 -0
- package/driver/cockroachdb/CockroachConnectionOptions.js.map +1 -1
- package/driver/cockroachdb/CockroachQueryRunner.d.ts +4 -0
- package/driver/cockroachdb/CockroachQueryRunner.js +35 -18
- package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
- package/driver/mongodb/MongoDriver.js +1 -1
- package/driver/mongodb/MongoDriver.js.map +1 -1
- package/driver/mysql/MysqlDriver.d.ts +8 -0
- package/driver/mysql/MysqlDriver.js +30 -4
- package/driver/mysql/MysqlDriver.js.map +1 -1
- package/driver/oracle/OracleDriver.d.ts +13 -0
- package/driver/oracle/OracleDriver.js +15 -0
- package/driver/oracle/OracleDriver.js.map +1 -1
- package/driver/oracle/OracleQueryRunner.js +4 -2
- package/driver/oracle/OracleQueryRunner.js.map +1 -1
- package/driver/sqlserver/SqlServerConnectionOptions.d.ts +9 -0
- package/driver/sqlserver/SqlServerConnectionOptions.js.map +1 -1
- package/driver/types/ColumnTypes.d.ts +1 -1
- package/driver/types/ColumnTypes.js.map +1 -1
- package/metadata/EntityMetadata.d.ts +10 -1
- package/metadata/EntityMetadata.js +33 -7
- package/metadata/EntityMetadata.js.map +1 -1
- package/metadata-builder/EntityMetadataBuilder.js +15 -0
- package/metadata-builder/EntityMetadataBuilder.js.map +1 -1
- package/metadata-builder/EntityMetadataValidator.js +12 -0
- package/metadata-builder/EntityMetadataValidator.js.map +1 -1
- package/metadata-builder/JunctionEntityMetadataBuilder.js +4 -0
- package/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
- package/metadata-builder/RelationJoinColumnBuilder.js +2 -0
- package/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
- package/package.json +1 -1
- package/persistence/EntityPersistExecutor.js +3 -11
- package/persistence/EntityPersistExecutor.js.map +1 -1
- package/query-builder/RelationIdLoader.d.ts +3 -1
- package/query-builder/RelationIdLoader.js +6 -5
- package/query-builder/RelationIdLoader.js.map +1 -1
- package/query-builder/SelectQueryBuilder.js +19 -3
- package/query-builder/SelectQueryBuilder.js.map +1 -1
- package/query-builder/transformer/PlainObjectToNewEntityTransformer.js +10 -7
- package/query-builder/transformer/PlainObjectToNewEntityTransformer.js.map +1 -1
- package/query-builder/transformer/RawSqlResultsToEntityTransformer.js +1 -1
- package/query-builder/transformer/RawSqlResultsToEntityTransformer.js.map +1 -1
- package/util/DateUtils.d.ts +0 -12
- package/util/DateUtils.js +16 -20
- package/util/DateUtils.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metadata-builder/JunctionEntityMetadataBuilder.ts"],"names":[],"mappings":"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","file":"JunctionEntityMetadataBuilder.js","sourcesContent":["import { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { EntityMetadata } from \"../metadata/EntityMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { IndexMetadata } from \"../metadata/IndexMetadata\"\nimport { JoinTableMetadataArgs } from \"../metadata-args/JoinTableMetadataArgs\"\nimport { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { TypeORMError } from \"../error\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\n\n/**\n * Creates EntityMetadata for junction tables.\n * Junction tables are tables generated by many-to-many relations.\n */\nexport class JunctionEntityMetadataBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds EntityMetadata for the junction of the given many-to-many relation.\n */\n build(\n relation: RelationMetadata,\n joinTable: JoinTableMetadataArgs,\n ): EntityMetadata {\n const referencedColumns = this.collectReferencedColumns(\n relation,\n joinTable,\n )\n const inverseReferencedColumns = this.collectInverseReferencedColumns(\n relation,\n joinTable,\n )\n\n const joinTableName =\n joinTable.name ||\n this.connection.namingStrategy.joinTableName(\n relation.entityMetadata.tableNameWithoutPrefix,\n relation.inverseEntityMetadata.tableNameWithoutPrefix,\n relation.propertyPath,\n relation.inverseRelation\n ? relation.inverseRelation.propertyName\n : \"\",\n )\n\n const entityMetadata = new EntityMetadata({\n connection: this.connection,\n args: {\n target: \"\",\n name: joinTableName,\n type: \"junction\",\n database:\n joinTable.database || relation.entityMetadata.database,\n schema: joinTable.schema || relation.entityMetadata.schema,\n synchronize: joinTable.synchronize,\n },\n })\n entityMetadata.build()\n\n // create original side junction columns\n const junctionColumns = referencedColumns.map((referencedColumn) => {\n const joinColumn = joinTable.joinColumns\n ? joinTable.joinColumns.find((joinColumnArgs) => {\n return (\n (!joinColumnArgs.referencedColumnName ||\n joinColumnArgs.referencedColumnName ===\n referencedColumn.propertyName) &&\n !!joinColumnArgs.name\n )\n })\n : undefined\n const columnName =\n joinColumn && joinColumn.name\n ? joinColumn.name\n : this.connection.namingStrategy.joinTableColumnName(\n relation.entityMetadata.tableNameWithoutPrefix,\n referencedColumn.propertyName,\n referencedColumn.databaseName,\n )\n\n return new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n referencedColumn: referencedColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: columnName,\n options: {\n name: columnName,\n length:\n !referencedColumn.length &&\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n (referencedColumn.generationStrategy === \"uuid\" ||\n referencedColumn.type === \"uuid\")\n ? \"36\"\n : referencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604\n width: referencedColumn.width,\n type: referencedColumn.type,\n precision: referencedColumn.precision,\n scale: referencedColumn.scale,\n charset: referencedColumn.charset,\n collation: referencedColumn.collation,\n zerofill: referencedColumn.zerofill,\n unsigned: referencedColumn.zerofill\n ? true\n : referencedColumn.unsigned,\n enum: referencedColumn.enum,\n enumName: referencedColumn.enumName,\n foreignKeyConstraintName:\n joinColumn?.foreignKeyConstraintName,\n nullable: false,\n primary: true,\n },\n },\n })\n })\n\n // create inverse side junction columns\n const inverseJunctionColumns = inverseReferencedColumns.map(\n (inverseReferencedColumn) => {\n const joinColumn = joinTable.inverseJoinColumns\n ? joinTable.inverseJoinColumns.find((joinColumnArgs) => {\n return (\n (!joinColumnArgs.referencedColumnName ||\n joinColumnArgs.referencedColumnName ===\n inverseReferencedColumn.propertyName) &&\n !!joinColumnArgs.name\n )\n })\n : undefined\n const columnName =\n joinColumn && joinColumn.name\n ? joinColumn.name\n : this.connection.namingStrategy.joinTableInverseColumnName(\n relation.inverseEntityMetadata\n .tableNameWithoutPrefix,\n inverseReferencedColumn.propertyName,\n inverseReferencedColumn.databaseName,\n )\n\n return new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n referencedColumn: inverseReferencedColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: columnName,\n options: {\n length:\n !inverseReferencedColumn.length &&\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n (inverseReferencedColumn.generationStrategy ===\n \"uuid\" ||\n inverseReferencedColumn.type === \"uuid\")\n ? \"36\"\n : inverseReferencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604\n width: inverseReferencedColumn.width, // fix https://github.com/typeorm/typeorm/issues/6442\n type: inverseReferencedColumn.type,\n precision: inverseReferencedColumn.precision,\n scale: inverseReferencedColumn.scale,\n charset: inverseReferencedColumn.charset,\n collation: inverseReferencedColumn.collation,\n zerofill: inverseReferencedColumn.zerofill,\n unsigned: inverseReferencedColumn.zerofill\n ? true\n : inverseReferencedColumn.unsigned,\n enum: inverseReferencedColumn.enum,\n enumName: inverseReferencedColumn.enumName,\n foreignKeyConstraintName:\n joinColumn?.foreignKeyConstraintName,\n name: columnName,\n nullable: false,\n primary: true,\n },\n },\n })\n },\n )\n\n this.changeDuplicatedColumnNames(\n junctionColumns,\n inverseJunctionColumns,\n )\n\n // set junction table columns\n entityMetadata.ownerColumns = junctionColumns\n entityMetadata.inverseColumns = inverseJunctionColumns\n entityMetadata.ownColumns = [\n ...junctionColumns,\n ...inverseJunctionColumns,\n ]\n entityMetadata.ownColumns.forEach(\n (column) => (column.relationMetadata = relation),\n )\n\n // create junction table foreign keys\n // Note: UPDATE CASCADE clause is not supported in Oracle.\n // Note: UPDATE/DELETE CASCADE clauses are not supported in Spanner.\n entityMetadata.foreignKeys = relation.createForeignKeyConstraints\n ? [\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: relation.entityMetadata,\n columns: junctionColumns,\n referencedColumns: referencedColumns,\n name: junctionColumns[0]?.foreignKeyConstraintName,\n onDelete:\n this.connection.driver.options.type === \"spanner\"\n ? \"NO ACTION\"\n : relation.onDelete || \"CASCADE\",\n onUpdate:\n this.connection.driver.options.type === \"oracle\" ||\n this.connection.driver.options.type === \"spanner\"\n ? \"NO ACTION\"\n : relation.onUpdate || \"CASCADE\",\n }),\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: relation.inverseEntityMetadata,\n columns: inverseJunctionColumns,\n referencedColumns: inverseReferencedColumns,\n name: inverseJunctionColumns[0]?.foreignKeyConstraintName,\n onDelete:\n this.connection.driver.options.type === \"spanner\"\n ? \"NO ACTION\"\n : relation.inverseRelation\n ? relation.inverseRelation.onDelete\n : \"CASCADE\",\n onUpdate:\n this.connection.driver.options.type === \"oracle\" ||\n this.connection.driver.options.type === \"spanner\"\n ? \"NO ACTION\"\n : relation.inverseRelation\n ? relation.inverseRelation.onUpdate\n : \"CASCADE\",\n }),\n ]\n : []\n\n // create junction table indices\n entityMetadata.ownIndices = [\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: junctionColumns,\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: inverseJunctionColumns,\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n ]\n\n // finally return entity metadata\n return entityMetadata\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Collects referenced columns from the given join column args.\n */\n protected collectReferencedColumns(\n relation: RelationMetadata,\n joinTable: JoinTableMetadataArgs,\n ): ColumnMetadata[] {\n const hasAnyReferencedColumnName = joinTable.joinColumns\n ? joinTable.joinColumns.find(\n (joinColumn) => !!joinColumn.referencedColumnName,\n )\n : false\n if (\n !joinTable.joinColumns ||\n (joinTable.joinColumns && !hasAnyReferencedColumnName)\n ) {\n return relation.entityMetadata.columns.filter(\n (column) => column.isPrimary,\n )\n } else {\n return joinTable.joinColumns.map((joinColumn) => {\n const referencedColumn = relation.entityMetadata.columns.find(\n (column) =>\n column.propertyName === joinColumn.referencedColumnName,\n )\n if (!referencedColumn)\n throw new TypeORMError(\n `Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.entityMetadata.name}`,\n )\n\n return referencedColumn\n })\n }\n }\n\n /**\n * Collects inverse referenced columns from the given join column args.\n */\n protected collectInverseReferencedColumns(\n relation: RelationMetadata,\n joinTable: JoinTableMetadataArgs,\n ): ColumnMetadata[] {\n const hasInverseJoinColumns = !!joinTable.inverseJoinColumns\n const hasAnyInverseReferencedColumnName = hasInverseJoinColumns\n ? joinTable.inverseJoinColumns!.find(\n (joinColumn) => !!joinColumn.referencedColumnName,\n )\n : false\n if (\n !hasInverseJoinColumns ||\n (hasInverseJoinColumns && !hasAnyInverseReferencedColumnName)\n ) {\n return relation.inverseEntityMetadata.primaryColumns\n } else {\n return joinTable.inverseJoinColumns!.map((joinColumn) => {\n const referencedColumn =\n relation.inverseEntityMetadata.ownColumns.find(\n (column) =>\n column.propertyName ===\n joinColumn.referencedColumnName,\n )\n if (!referencedColumn)\n throw new TypeORMError(\n `Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.inverseEntityMetadata.name}`,\n )\n\n return referencedColumn\n })\n }\n }\n\n protected changeDuplicatedColumnNames(\n junctionColumns: ColumnMetadata[],\n inverseJunctionColumns: ColumnMetadata[],\n ) {\n junctionColumns.forEach((junctionColumn) => {\n inverseJunctionColumns.forEach((inverseJunctionColumn) => {\n if (\n junctionColumn.givenDatabaseName ===\n inverseJunctionColumn.givenDatabaseName\n ) {\n const junctionColumnName =\n this.connection.namingStrategy.joinTableColumnDuplicationPrefix(\n junctionColumn.propertyName,\n 1,\n )\n junctionColumn.propertyName = junctionColumnName\n junctionColumn.givenDatabaseName = junctionColumnName\n\n const inverseJunctionColumnName =\n this.connection.namingStrategy.joinTableColumnDuplicationPrefix(\n inverseJunctionColumn.propertyName,\n 2,\n )\n inverseJunctionColumn.propertyName =\n inverseJunctionColumnName\n inverseJunctionColumn.givenDatabaseName =\n inverseJunctionColumnName\n }\n })\n })\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/metadata-builder/JunctionEntityMetadataBuilder.ts"],"names":[],"mappings":"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","file":"JunctionEntityMetadataBuilder.js","sourcesContent":["import { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { EntityMetadata } from \"../metadata/EntityMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { IndexMetadata } from \"../metadata/IndexMetadata\"\nimport { JoinTableMetadataArgs } from \"../metadata-args/JoinTableMetadataArgs\"\nimport { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { TypeORMError } from \"../error\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\n\n/**\n * Creates EntityMetadata for junction tables.\n * Junction tables are tables generated by many-to-many relations.\n */\nexport class JunctionEntityMetadataBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds EntityMetadata for the junction of the given many-to-many relation.\n */\n build(\n relation: RelationMetadata,\n joinTable: JoinTableMetadataArgs,\n ): EntityMetadata {\n const referencedColumns = this.collectReferencedColumns(\n relation,\n joinTable,\n )\n const inverseReferencedColumns = this.collectInverseReferencedColumns(\n relation,\n joinTable,\n )\n\n const joinTableName =\n joinTable.name ||\n this.connection.namingStrategy.joinTableName(\n relation.entityMetadata.tableNameWithoutPrefix,\n relation.inverseEntityMetadata.tableNameWithoutPrefix,\n relation.propertyPath,\n relation.inverseRelation\n ? relation.inverseRelation.propertyName\n : \"\",\n )\n\n const entityMetadata = new EntityMetadata({\n connection: this.connection,\n args: {\n target: \"\",\n name: joinTableName,\n type: \"junction\",\n database:\n joinTable.database || relation.entityMetadata.database,\n schema: joinTable.schema || relation.entityMetadata.schema,\n synchronize: joinTable.synchronize,\n },\n })\n entityMetadata.build()\n\n // create original side junction columns\n const junctionColumns = referencedColumns.map((referencedColumn) => {\n const joinColumn = joinTable.joinColumns\n ? joinTable.joinColumns.find((joinColumnArgs) => {\n return (\n (!joinColumnArgs.referencedColumnName ||\n joinColumnArgs.referencedColumnName ===\n referencedColumn.propertyName) &&\n !!joinColumnArgs.name\n )\n })\n : undefined\n const columnName =\n joinColumn && joinColumn.name\n ? joinColumn.name\n : this.connection.namingStrategy.joinTableColumnName(\n relation.entityMetadata.tableNameWithoutPrefix,\n referencedColumn.propertyName,\n referencedColumn.databaseName,\n )\n\n return new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n referencedColumn: referencedColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: columnName,\n options: {\n name: columnName,\n length:\n !referencedColumn.length &&\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n // some versions of mariadb support the column type and should not try to provide the length property\n this.connection.driver.normalizeType(\n referencedColumn,\n ) !== \"uuid\" &&\n (referencedColumn.generationStrategy === \"uuid\" ||\n referencedColumn.type === \"uuid\")\n ? \"36\"\n : referencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604\n width: referencedColumn.width,\n type: referencedColumn.type,\n precision: referencedColumn.precision,\n scale: referencedColumn.scale,\n charset: referencedColumn.charset,\n collation: referencedColumn.collation,\n zerofill: referencedColumn.zerofill,\n unsigned: referencedColumn.zerofill\n ? true\n : referencedColumn.unsigned,\n enum: referencedColumn.enum,\n enumName: referencedColumn.enumName,\n foreignKeyConstraintName:\n joinColumn?.foreignKeyConstraintName,\n nullable: false,\n primary: true,\n },\n },\n })\n })\n\n // create inverse side junction columns\n const inverseJunctionColumns = inverseReferencedColumns.map(\n (inverseReferencedColumn) => {\n const joinColumn = joinTable.inverseJoinColumns\n ? joinTable.inverseJoinColumns.find((joinColumnArgs) => {\n return (\n (!joinColumnArgs.referencedColumnName ||\n joinColumnArgs.referencedColumnName ===\n inverseReferencedColumn.propertyName) &&\n !!joinColumnArgs.name\n )\n })\n : undefined\n const columnName =\n joinColumn && joinColumn.name\n ? joinColumn.name\n : this.connection.namingStrategy.joinTableInverseColumnName(\n relation.inverseEntityMetadata\n .tableNameWithoutPrefix,\n inverseReferencedColumn.propertyName,\n inverseReferencedColumn.databaseName,\n )\n\n return new ColumnMetadata({\n connection: this.connection,\n entityMetadata: entityMetadata,\n referencedColumn: inverseReferencedColumn,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: columnName,\n options: {\n length:\n !inverseReferencedColumn.length &&\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n // some versions of mariadb support the column type and should not try to provide the length property\n this.connection.driver.normalizeType(\n inverseReferencedColumn,\n ) !== \"uuid\" &&\n (inverseReferencedColumn.generationStrategy ===\n \"uuid\" ||\n inverseReferencedColumn.type === \"uuid\")\n ? \"36\"\n : inverseReferencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604\n width: inverseReferencedColumn.width, // fix https://github.com/typeorm/typeorm/issues/6442\n type: inverseReferencedColumn.type,\n precision: inverseReferencedColumn.precision,\n scale: inverseReferencedColumn.scale,\n charset: inverseReferencedColumn.charset,\n collation: inverseReferencedColumn.collation,\n zerofill: inverseReferencedColumn.zerofill,\n unsigned: inverseReferencedColumn.zerofill\n ? true\n : inverseReferencedColumn.unsigned,\n enum: inverseReferencedColumn.enum,\n enumName: inverseReferencedColumn.enumName,\n foreignKeyConstraintName:\n joinColumn?.foreignKeyConstraintName,\n name: columnName,\n nullable: false,\n primary: true,\n },\n },\n })\n },\n )\n\n this.changeDuplicatedColumnNames(\n junctionColumns,\n inverseJunctionColumns,\n )\n\n // set junction table columns\n entityMetadata.ownerColumns = junctionColumns\n entityMetadata.inverseColumns = inverseJunctionColumns\n entityMetadata.ownColumns = [\n ...junctionColumns,\n ...inverseJunctionColumns,\n ]\n entityMetadata.ownColumns.forEach(\n (column) => (column.relationMetadata = relation),\n )\n\n // create junction table foreign keys\n // Note: UPDATE CASCADE clause is not supported in Oracle.\n // Note: UPDATE/DELETE CASCADE clauses are not supported in Spanner.\n entityMetadata.foreignKeys = relation.createForeignKeyConstraints\n ? [\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: relation.entityMetadata,\n columns: junctionColumns,\n referencedColumns: referencedColumns,\n name: junctionColumns[0]?.foreignKeyConstraintName,\n onDelete:\n this.connection.driver.options.type === \"spanner\"\n ? \"NO ACTION\"\n : relation.onDelete || \"CASCADE\",\n onUpdate:\n this.connection.driver.options.type === \"oracle\" ||\n this.connection.driver.options.type === \"spanner\"\n ? \"NO ACTION\"\n : relation.onUpdate || \"CASCADE\",\n }),\n new ForeignKeyMetadata({\n entityMetadata: entityMetadata,\n referencedEntityMetadata: relation.inverseEntityMetadata,\n columns: inverseJunctionColumns,\n referencedColumns: inverseReferencedColumns,\n name: inverseJunctionColumns[0]?.foreignKeyConstraintName,\n onDelete:\n this.connection.driver.options.type === \"spanner\"\n ? \"NO ACTION\"\n : relation.inverseRelation\n ? relation.inverseRelation.onDelete\n : \"CASCADE\",\n onUpdate:\n this.connection.driver.options.type === \"oracle\" ||\n this.connection.driver.options.type === \"spanner\"\n ? \"NO ACTION\"\n : relation.inverseRelation\n ? relation.inverseRelation.onUpdate\n : \"CASCADE\",\n }),\n ]\n : []\n\n // create junction table indices\n entityMetadata.ownIndices = [\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: junctionColumns,\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n\n new IndexMetadata({\n entityMetadata: entityMetadata,\n columns: inverseJunctionColumns,\n args: {\n target: entityMetadata.target,\n synchronize: true,\n },\n }),\n ]\n\n // finally return entity metadata\n return entityMetadata\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Collects referenced columns from the given join column args.\n */\n protected collectReferencedColumns(\n relation: RelationMetadata,\n joinTable: JoinTableMetadataArgs,\n ): ColumnMetadata[] {\n const hasAnyReferencedColumnName = joinTable.joinColumns\n ? joinTable.joinColumns.find(\n (joinColumn) => !!joinColumn.referencedColumnName,\n )\n : false\n if (\n !joinTable.joinColumns ||\n (joinTable.joinColumns && !hasAnyReferencedColumnName)\n ) {\n return relation.entityMetadata.columns.filter(\n (column) => column.isPrimary,\n )\n } else {\n return joinTable.joinColumns.map((joinColumn) => {\n const referencedColumn = relation.entityMetadata.columns.find(\n (column) =>\n column.propertyName === joinColumn.referencedColumnName,\n )\n if (!referencedColumn)\n throw new TypeORMError(\n `Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.entityMetadata.name}`,\n )\n\n return referencedColumn\n })\n }\n }\n\n /**\n * Collects inverse referenced columns from the given join column args.\n */\n protected collectInverseReferencedColumns(\n relation: RelationMetadata,\n joinTable: JoinTableMetadataArgs,\n ): ColumnMetadata[] {\n const hasInverseJoinColumns = !!joinTable.inverseJoinColumns\n const hasAnyInverseReferencedColumnName = hasInverseJoinColumns\n ? joinTable.inverseJoinColumns!.find(\n (joinColumn) => !!joinColumn.referencedColumnName,\n )\n : false\n if (\n !hasInverseJoinColumns ||\n (hasInverseJoinColumns && !hasAnyInverseReferencedColumnName)\n ) {\n return relation.inverseEntityMetadata.primaryColumns\n } else {\n return joinTable.inverseJoinColumns!.map((joinColumn) => {\n const referencedColumn =\n relation.inverseEntityMetadata.ownColumns.find(\n (column) =>\n column.propertyName ===\n joinColumn.referencedColumnName,\n )\n if (!referencedColumn)\n throw new TypeORMError(\n `Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.inverseEntityMetadata.name}`,\n )\n\n return referencedColumn\n })\n }\n }\n\n protected changeDuplicatedColumnNames(\n junctionColumns: ColumnMetadata[],\n inverseJunctionColumns: ColumnMetadata[],\n ) {\n junctionColumns.forEach((junctionColumn) => {\n inverseJunctionColumns.forEach((inverseJunctionColumn) => {\n if (\n junctionColumn.givenDatabaseName ===\n inverseJunctionColumn.givenDatabaseName\n ) {\n const junctionColumnName =\n this.connection.namingStrategy.joinTableColumnDuplicationPrefix(\n junctionColumn.propertyName,\n 1,\n )\n junctionColumn.propertyName = junctionColumnName\n junctionColumn.givenDatabaseName = junctionColumnName\n\n const inverseJunctionColumnName =\n this.connection.namingStrategy.joinTableColumnDuplicationPrefix(\n inverseJunctionColumn.propertyName,\n 2,\n )\n inverseJunctionColumn.propertyName =\n inverseJunctionColumnName\n inverseJunctionColumn.givenDatabaseName =\n inverseJunctionColumnName\n }\n })\n })\n }\n}\n"],"sourceRoot":".."}
|
|
@@ -149,6 +149,8 @@ class RelationJoinColumnBuilder {
|
|
|
149
149
|
(DriverUtils_1.DriverUtils.isMySQLFamily(this.connection.driver) ||
|
|
150
150
|
this.connection.driver.options.type ===
|
|
151
151
|
"aurora-mysql") &&
|
|
152
|
+
// some versions of mariadb support the column type and should not try to provide the length property
|
|
153
|
+
this.connection.driver.normalizeType(referencedColumn) !== "uuid" &&
|
|
152
154
|
(referencedColumn.generationStrategy ===
|
|
153
155
|
"uuid" ||
|
|
154
156
|
referencedColumn.type === "uuid")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metadata-builder/RelationJoinColumnBuilder.ts"],"names":[],"mappings":"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","file":"RelationJoinColumnBuilder.js","sourcesContent":["import { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { UniqueMetadata } from \"../metadata/UniqueMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { JoinColumnMetadataArgs } from \"../metadata-args/JoinColumnMetadataArgs\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { TypeORMError } from \"../error\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\n\n/**\n * Builds join column for the many-to-one and one-to-one owner relations.\n *\n * Cases it should cover:\n * 1. when join column is set with custom name and without referenced column name\n * we need automatically set referenced column name - primary ids by default\n * @JoinColumn({ name: \"custom_name\" })\n *\n * 2. when join column is set with only referenced column name\n * we need automatically set join column name - relation name + referenced column name\n * @JoinColumn({ referencedColumnName: \"title\" })\n *\n * 3. when join column is set without both referenced column name and join column name\n * we need to automatically set both of them\n * @JoinColumn()\n *\n * 4. when join column is not set at all (as in case of @ManyToOne relation)\n * we need to create join column for it with proper referenced column name and join column name\n *\n * 5. when multiple join columns set none of referencedColumnName and name can be optional\n * both options are required\n * @JoinColumn([\n * { name: \"category_title\", referencedColumnName: \"type\" },\n * { name: \"category_title\", referencedColumnName: \"name\" },\n * ])\n *\n * Since for many-to-one relations having JoinColumn decorator is not required,\n * we need to go through each many-to-one relation without join column decorator set\n * and create join column metadata args for them.\n */\nexport class RelationJoinColumnBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds a foreign key of the many-to-one or one-to-one owner relations.\n */\n build(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): {\n foreignKey: ForeignKeyMetadata | undefined\n columns: ColumnMetadata[]\n uniqueConstraint: UniqueMetadata | undefined\n } {\n const referencedColumns = this.collectReferencedColumns(\n joinColumns,\n relation,\n )\n const columns = this.collectColumns(\n joinColumns,\n relation,\n referencedColumns,\n )\n if (!referencedColumns.length || !relation.createForeignKeyConstraints)\n return {\n foreignKey: undefined,\n columns,\n uniqueConstraint: undefined,\n } // this case is possible for one-to-one non owning side and relations with createForeignKeyConstraints = false\n\n const foreignKey = new ForeignKeyMetadata({\n name: joinColumns[0]?.foreignKeyConstraintName,\n entityMetadata: relation.entityMetadata,\n referencedEntityMetadata: relation.inverseEntityMetadata,\n namingStrategy: this.connection.namingStrategy,\n columns,\n referencedColumns,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n deferrable: relation.deferrable,\n })\n\n // SQL requires UNIQUE/PK constraints on columns referenced by a FK\n // Skip creating the unique constraint for the referenced columns if\n // they are already contained in the PK of the referenced entity\n if (\n columns.every((column) => column.isPrimary) ||\n !relation.isOneToOne\n ) {\n return { foreignKey, columns, uniqueConstraint: undefined }\n }\n\n const uniqueConstraint = new UniqueMetadata({\n entityMetadata: relation.entityMetadata,\n columns: foreignKey.columns,\n args: {\n name: this.connection.namingStrategy.relationConstraintName(\n relation.entityMetadata.tableName,\n foreignKey.columns.map((column) => column.databaseName),\n ),\n target: relation.entityMetadata.target,\n },\n })\n uniqueConstraint.build(this.connection.namingStrategy)\n\n return { foreignKey, columns, uniqueConstraint }\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Collects referenced columns from the given join column args.\n */\n protected collectReferencedColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): ColumnMetadata[] {\n const hasAnyReferencedColumnName = joinColumns.find(\n (joinColumnArgs) => !!joinColumnArgs.referencedColumnName,\n )\n const manyToOneWithoutJoinColumn =\n joinColumns.length === 0 && relation.isManyToOne\n const hasJoinColumnWithoutAnyReferencedColumnName =\n joinColumns.length > 0 && !hasAnyReferencedColumnName\n\n if (\n manyToOneWithoutJoinColumn ||\n hasJoinColumnWithoutAnyReferencedColumnName\n ) {\n // covers case3 and case1\n return relation.inverseEntityMetadata.primaryColumns\n } else {\n // cases with referenced columns defined\n return joinColumns.map((joinColumn) => {\n const referencedColumn =\n relation.inverseEntityMetadata.ownColumns.find(\n (column) =>\n column.propertyName ===\n joinColumn.referencedColumnName,\n ) // todo: can we also search in relations?\n if (!referencedColumn)\n throw new TypeORMError(\n `Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.inverseEntityMetadata.name}`,\n )\n\n return referencedColumn\n })\n }\n }\n\n /**\n * Collects columns from the given join column args.\n */\n private collectColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n referencedColumns: ColumnMetadata[],\n ): ColumnMetadata[] {\n return referencedColumns.map((referencedColumn) => {\n // in the case if relation has join column with only name set we need this check\n const joinColumnMetadataArg = joinColumns.find((joinColumn) => {\n return (\n (!joinColumn.referencedColumnName ||\n joinColumn.referencedColumnName ===\n referencedColumn.propertyName) &&\n !!joinColumn.name\n )\n })\n const joinColumnName = joinColumnMetadataArg\n ? joinColumnMetadataArg.name\n : this.connection.namingStrategy.joinColumnName(\n relation.propertyName,\n referencedColumn.propertyName,\n )\n\n const relationalColumns = relation.embeddedMetadata\n ? relation.embeddedMetadata.columns\n : relation.entityMetadata.ownColumns\n let relationalColumn = relationalColumns.find(\n (column) =>\n column.databaseNameWithoutPrefixes === joinColumnName,\n )\n if (!relationalColumn) {\n relationalColumn = new ColumnMetadata({\n connection: this.connection,\n entityMetadata: relation.entityMetadata,\n embeddedMetadata: relation.embeddedMetadata,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: relation.propertyName,\n options: {\n name: joinColumnName,\n type: referencedColumn.type,\n length:\n !referencedColumn.length &&\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n (referencedColumn.generationStrategy ===\n \"uuid\" ||\n referencedColumn.type === \"uuid\")\n ? \"36\"\n : referencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604\n width: referencedColumn.width,\n charset: referencedColumn.charset,\n collation: referencedColumn.collation,\n precision: referencedColumn.precision,\n scale: referencedColumn.scale,\n zerofill: referencedColumn.zerofill,\n unsigned: referencedColumn.unsigned,\n comment: referencedColumn.comment,\n enum: referencedColumn.enum,\n enumName: referencedColumn.enumName,\n primary: relation.isPrimary,\n nullable: relation.isNullable,\n },\n },\n })\n relation.entityMetadata.registerColumn(relationalColumn)\n }\n relationalColumn.referencedColumn = referencedColumn // its important to set it here because we need to set referenced column for user defined join column\n relationalColumn.type = referencedColumn.type // also since types of relational column and join column must be equal we override user defined column type\n relationalColumn.relationMetadata = relation\n relationalColumn.build(this.connection)\n return relationalColumn\n })\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/metadata-builder/RelationJoinColumnBuilder.ts"],"names":[],"mappings":";;;AAAA,+DAA2D;AAC3D,+DAA2D;AAC3D,uEAAmE;AAInE,oCAAuC;AACvC,uDAAmD;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAa,yBAAyB;IAClC,4EAA4E;IAC5E,cAAc;IACd,4EAA4E;IAE5E,YAAoB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAE9C,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAE5E;;OAEG;IACH,KAAK,CACD,WAAqC,EACrC,QAA0B;;QAM1B,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CACnD,WAAW,EACX,QAAQ,CACX,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAC/B,WAAW,EACX,QAAQ,EACR,iBAAiB,CACpB,CAAA;QACD,IAAI,CAAC,iBAAiB,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,2BAA2B;YAClE,OAAO;gBACH,UAAU,EAAE,SAAS;gBACrB,OAAO;gBACP,gBAAgB,EAAE,SAAS;aAC9B,CAAA,CAAC,8GAA8G;QAEpH,MAAM,UAAU,GAAG,IAAI,uCAAkB,CAAC;YACtC,IAAI,EAAE,MAAA,WAAW,CAAC,CAAC,CAAC,0CAAE,wBAAwB;YAC9C,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,wBAAwB,EAAE,QAAQ,CAAC,qBAAqB;YACxD,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc;YAC9C,OAAO;YACP,iBAAiB;YACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;SAClC,CAAC,CAAA;QAEF,mEAAmE;QACnE,oEAAoE;QACpE,gEAAgE;QAChE,IACI,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;YAC3C,CAAC,QAAQ,CAAC,UAAU,EACtB;YACE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAA;SAC9D;QAED,MAAM,gBAAgB,GAAG,IAAI,+BAAc,CAAC;YACxC,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,IAAI,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,sBAAsB,CACvD,QAAQ,CAAC,cAAc,CAAC,SAAS,EACjC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAC1D;gBACD,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM;aACzC;SACJ,CAAC,CAAA;QACF,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;QAEtD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAA;IACpD,CAAC;IAED,4EAA4E;IAC5E,oBAAoB;IACpB,4EAA4E;IAE5E;;OAEG;IACO,wBAAwB,CAC9B,WAAqC,EACrC,QAA0B;QAE1B,MAAM,0BAA0B,GAAG,WAAW,CAAC,IAAI,CAC/C,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAC5D,CAAA;QACD,MAAM,0BAA0B,GAC5B,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAA;QACpD,MAAM,2CAA2C,GAC7C,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAA;QAEzD,IACI,0BAA0B;YAC1B,2CAA2C,EAC7C;YACE,yBAAyB;YACzB,OAAO,QAAQ,CAAC,qBAAqB,CAAC,cAAc,CAAA;SACvD;aAAM;YACH,wCAAwC;YACxC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;gBAClC,MAAM,gBAAgB,GAClB,QAAQ,CAAC,qBAAqB,CAAC,UAAU,CAAC,IAAI,CAC1C,CAAC,MAAM,EAAE,EAAE,CACP,MAAM,CAAC,YAAY;oBACnB,UAAU,CAAC,oBAAoB,CACtC,CAAA,CAAC,yCAAyC;gBAC/C,IAAI,CAAC,gBAAgB;oBACjB,MAAM,IAAI,oBAAY,CAClB,qBAAqB,UAAU,CAAC,oBAAoB,4BAA4B,QAAQ,CAAC,qBAAqB,CAAC,IAAI,EAAE,CACxH,CAAA;gBAEL,OAAO,gBAAgB,CAAA;YAC3B,CAAC,CAAC,CAAA;SACL;IACL,CAAC;IAED;;OAEG;IACK,cAAc,CAClB,WAAqC,EACrC,QAA0B,EAC1B,iBAAmC;QAEnC,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,EAAE;YAC9C,gFAAgF;YAChF,MAAM,qBAAqB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;gBAC1D,OAAO,CACH,CAAC,CAAC,UAAU,CAAC,oBAAoB;oBAC7B,UAAU,CAAC,oBAAoB;wBAC3B,gBAAgB,CAAC,YAAY,CAAC;oBACtC,CAAC,CAAC,UAAU,CAAC,IAAI,CACpB,CAAA;YACL,CAAC,CAAC,CAAA;YACF,MAAM,cAAc,GAAG,qBAAqB;gBACxC,CAAC,CAAC,qBAAqB,CAAC,IAAI;gBAC5B,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,cAAc,CACzC,QAAQ,CAAC,YAAY,EACrB,gBAAgB,CAAC,YAAY,CAChC,CAAA;YAEP,MAAM,iBAAiB,GAAG,QAAQ,CAAC,gBAAgB;gBAC/C,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO;gBACnC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAA;YACxC,IAAI,gBAAgB,GAAG,iBAAiB,CAAC,IAAI,CACzC,CAAC,MAAM,EAAE,EAAE,CACP,MAAM,CAAC,2BAA2B,KAAK,cAAc,CAC5D,CAAA;YACD,IAAI,CAAC,gBAAgB,EAAE;gBACnB,gBAAgB,GAAG,IAAI,+BAAc,CAAC;oBAClC,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,cAAc,EAAE,QAAQ,CAAC,cAAc;oBACvC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;oBAC3C,IAAI,EAAE;wBACF,MAAM,EAAE,EAAE;wBACV,IAAI,EAAE,SAAS;wBACf,YAAY,EAAE,QAAQ,CAAC,YAAY;wBACnC,OAAO,EAAE;4BACL,IAAI,EAAE,cAAc;4BACpB,IAAI,EAAE,gBAAgB,CAAC,IAAI;4BAC3B,MAAM,EACF,CAAC,gBAAgB,CAAC,MAAM;gCACxB,CAAC,yBAAW,CAAC,aAAa,CACtB,IAAI,CAAC,UAAU,CAAC,MAAM,CACzB;oCACG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;wCAC/B,cAAc,CAAC;gCACvB,qGAAqG;gCACrG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAChC,gBAAgB,CACnB,KAAK,MAAM;gCACZ,CAAC,gBAAgB,CAAC,kBAAkB;oCAChC,MAAM;oCACN,gBAAgB,CAAC,IAAI,KAAK,MAAM,CAAC;gCACjC,CAAC,CAAC,IAAI;gCACN,CAAC,CAAC,gBAAgB,CAAC,MAAM;4BACjC,KAAK,EAAE,gBAAgB,CAAC,KAAK;4BAC7B,OAAO,EAAE,gBAAgB,CAAC,OAAO;4BACjC,SAAS,EAAE,gBAAgB,CAAC,SAAS;4BACrC,SAAS,EAAE,gBAAgB,CAAC,SAAS;4BACrC,KAAK,EAAE,gBAAgB,CAAC,KAAK;4BAC7B,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;4BACnC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;4BACnC,OAAO,EAAE,gBAAgB,CAAC,OAAO;4BACjC,IAAI,EAAE,gBAAgB,CAAC,IAAI;4BAC3B,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;4BACnC,OAAO,EAAE,QAAQ,CAAC,SAAS;4BAC3B,QAAQ,EAAE,QAAQ,CAAC,UAAU;yBAChC;qBACJ;iBACJ,CAAC,CAAA;gBACF,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAA;aAC3D;YACD,gBAAgB,CAAC,gBAAgB,GAAG,gBAAgB,CAAA,CAAC,qGAAqG;YAC1J,gBAAgB,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAA,CAAC,2GAA2G;YACzJ,gBAAgB,CAAC,gBAAgB,GAAG,QAAQ,CAAA;YAC5C,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACvC,OAAO,gBAAgB,CAAA;QAC3B,CAAC,CAAC,CAAA;IACN,CAAC;CACJ;AA5MD,8DA4MC","file":"RelationJoinColumnBuilder.js","sourcesContent":["import { ColumnMetadata } from \"../metadata/ColumnMetadata\"\nimport { UniqueMetadata } from \"../metadata/UniqueMetadata\"\nimport { ForeignKeyMetadata } from \"../metadata/ForeignKeyMetadata\"\nimport { RelationMetadata } from \"../metadata/RelationMetadata\"\nimport { JoinColumnMetadataArgs } from \"../metadata-args/JoinColumnMetadataArgs\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { TypeORMError } from \"../error\"\nimport { DriverUtils } from \"../driver/DriverUtils\"\n\n/**\n * Builds join column for the many-to-one and one-to-one owner relations.\n *\n * Cases it should cover:\n * 1. when join column is set with custom name and without referenced column name\n * we need automatically set referenced column name - primary ids by default\n * @JoinColumn({ name: \"custom_name\" })\n *\n * 2. when join column is set with only referenced column name\n * we need automatically set join column name - relation name + referenced column name\n * @JoinColumn({ referencedColumnName: \"title\" })\n *\n * 3. when join column is set without both referenced column name and join column name\n * we need to automatically set both of them\n * @JoinColumn()\n *\n * 4. when join column is not set at all (as in case of @ManyToOne relation)\n * we need to create join column for it with proper referenced column name and join column name\n *\n * 5. when multiple join columns set none of referencedColumnName and name can be optional\n * both options are required\n * @JoinColumn([\n * { name: \"category_title\", referencedColumnName: \"type\" },\n * { name: \"category_title\", referencedColumnName: \"name\" },\n * ])\n *\n * Since for many-to-one relations having JoinColumn decorator is not required,\n * we need to go through each many-to-one relation without join column decorator set\n * and create join column metadata args for them.\n */\nexport class RelationJoinColumnBuilder {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(private connection: DataSource) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Builds a foreign key of the many-to-one or one-to-one owner relations.\n */\n build(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): {\n foreignKey: ForeignKeyMetadata | undefined\n columns: ColumnMetadata[]\n uniqueConstraint: UniqueMetadata | undefined\n } {\n const referencedColumns = this.collectReferencedColumns(\n joinColumns,\n relation,\n )\n const columns = this.collectColumns(\n joinColumns,\n relation,\n referencedColumns,\n )\n if (!referencedColumns.length || !relation.createForeignKeyConstraints)\n return {\n foreignKey: undefined,\n columns,\n uniqueConstraint: undefined,\n } // this case is possible for one-to-one non owning side and relations with createForeignKeyConstraints = false\n\n const foreignKey = new ForeignKeyMetadata({\n name: joinColumns[0]?.foreignKeyConstraintName,\n entityMetadata: relation.entityMetadata,\n referencedEntityMetadata: relation.inverseEntityMetadata,\n namingStrategy: this.connection.namingStrategy,\n columns,\n referencedColumns,\n onDelete: relation.onDelete,\n onUpdate: relation.onUpdate,\n deferrable: relation.deferrable,\n })\n\n // SQL requires UNIQUE/PK constraints on columns referenced by a FK\n // Skip creating the unique constraint for the referenced columns if\n // they are already contained in the PK of the referenced entity\n if (\n columns.every((column) => column.isPrimary) ||\n !relation.isOneToOne\n ) {\n return { foreignKey, columns, uniqueConstraint: undefined }\n }\n\n const uniqueConstraint = new UniqueMetadata({\n entityMetadata: relation.entityMetadata,\n columns: foreignKey.columns,\n args: {\n name: this.connection.namingStrategy.relationConstraintName(\n relation.entityMetadata.tableName,\n foreignKey.columns.map((column) => column.databaseName),\n ),\n target: relation.entityMetadata.target,\n },\n })\n uniqueConstraint.build(this.connection.namingStrategy)\n\n return { foreignKey, columns, uniqueConstraint }\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Collects referenced columns from the given join column args.\n */\n protected collectReferencedColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n ): ColumnMetadata[] {\n const hasAnyReferencedColumnName = joinColumns.find(\n (joinColumnArgs) => !!joinColumnArgs.referencedColumnName,\n )\n const manyToOneWithoutJoinColumn =\n joinColumns.length === 0 && relation.isManyToOne\n const hasJoinColumnWithoutAnyReferencedColumnName =\n joinColumns.length > 0 && !hasAnyReferencedColumnName\n\n if (\n manyToOneWithoutJoinColumn ||\n hasJoinColumnWithoutAnyReferencedColumnName\n ) {\n // covers case3 and case1\n return relation.inverseEntityMetadata.primaryColumns\n } else {\n // cases with referenced columns defined\n return joinColumns.map((joinColumn) => {\n const referencedColumn =\n relation.inverseEntityMetadata.ownColumns.find(\n (column) =>\n column.propertyName ===\n joinColumn.referencedColumnName,\n ) // todo: can we also search in relations?\n if (!referencedColumn)\n throw new TypeORMError(\n `Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.inverseEntityMetadata.name}`,\n )\n\n return referencedColumn\n })\n }\n }\n\n /**\n * Collects columns from the given join column args.\n */\n private collectColumns(\n joinColumns: JoinColumnMetadataArgs[],\n relation: RelationMetadata,\n referencedColumns: ColumnMetadata[],\n ): ColumnMetadata[] {\n return referencedColumns.map((referencedColumn) => {\n // in the case if relation has join column with only name set we need this check\n const joinColumnMetadataArg = joinColumns.find((joinColumn) => {\n return (\n (!joinColumn.referencedColumnName ||\n joinColumn.referencedColumnName ===\n referencedColumn.propertyName) &&\n !!joinColumn.name\n )\n })\n const joinColumnName = joinColumnMetadataArg\n ? joinColumnMetadataArg.name\n : this.connection.namingStrategy.joinColumnName(\n relation.propertyName,\n referencedColumn.propertyName,\n )\n\n const relationalColumns = relation.embeddedMetadata\n ? relation.embeddedMetadata.columns\n : relation.entityMetadata.ownColumns\n let relationalColumn = relationalColumns.find(\n (column) =>\n column.databaseNameWithoutPrefixes === joinColumnName,\n )\n if (!relationalColumn) {\n relationalColumn = new ColumnMetadata({\n connection: this.connection,\n entityMetadata: relation.entityMetadata,\n embeddedMetadata: relation.embeddedMetadata,\n args: {\n target: \"\",\n mode: \"virtual\",\n propertyName: relation.propertyName,\n options: {\n name: joinColumnName,\n type: referencedColumn.type,\n length:\n !referencedColumn.length &&\n (DriverUtils.isMySQLFamily(\n this.connection.driver,\n ) ||\n this.connection.driver.options.type ===\n \"aurora-mysql\") &&\n // some versions of mariadb support the column type and should not try to provide the length property\n this.connection.driver.normalizeType(\n referencedColumn,\n ) !== \"uuid\" &&\n (referencedColumn.generationStrategy ===\n \"uuid\" ||\n referencedColumn.type === \"uuid\")\n ? \"36\"\n : referencedColumn.length, // fix https://github.com/typeorm/typeorm/issues/3604\n width: referencedColumn.width,\n charset: referencedColumn.charset,\n collation: referencedColumn.collation,\n precision: referencedColumn.precision,\n scale: referencedColumn.scale,\n zerofill: referencedColumn.zerofill,\n unsigned: referencedColumn.unsigned,\n comment: referencedColumn.comment,\n enum: referencedColumn.enum,\n enumName: referencedColumn.enumName,\n primary: relation.isPrimary,\n nullable: relation.isNullable,\n },\n },\n })\n relation.entityMetadata.registerColumn(relationalColumn)\n }\n relationalColumn.referencedColumn = referencedColumn // its important to set it here because we need to set referenced column for user defined join column\n relationalColumn.type = referencedColumn.type // also since types of relational column and join column must be equal we override user defined column type\n relationalColumn.relationMetadata = relation\n relationalColumn.build(this.connection)\n return relationalColumn\n })\n }\n}\n"],"sourceRoot":".."}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "name": "typeorm", "private": false, "version": "0.3.
|
|
1
|
+
{ "name": "typeorm", "private": false, "version": "0.3.17-dev.abb9079", "description": "Data-Mapper ORM for TypeScript, ES7, ES6, ES5. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, MongoDB databases.", "license": "MIT", "readmeFilename": "README.md", "author": { "name": "Umed Khudoiberdiev", "email": "pleerock.me@gmail.com" }, "engines": { "node": ">= 12.9.0" }, "exports": { ".": { "types": "./index.d.ts", "node": { "import": "./index.mjs", "require": "./index.js", "types": "./index.d.ts" }, "browser": { "require": "./index.js", "import": "./browser/index.js", "default": "./index.js" } }, "./browser": { "types": "./index.d.ts", "default": "./browser/index.js" }, "./*.js": "./*.js", "./*": { "require": "./*.js", "import": "./*" } }, "main": "./index.js", "module": "./index.mjs", "types": "./index.d.ts", "browser": { "./browser/connection/ConnectionOptionsReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js", "./browser/connection/options-reader/ConnectionOptionsXmlReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js", "./browser/connection/options-reader/ConnectionOptionsYmlReader.js": "./browser/platform/BrowserConnectionOptionsReaderDummy.js", "./browser/driver/aurora-data-api/AuroraDataApiDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/better-sqlite3/BetterSqlite3Driver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/cockroachdb/CockroachDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mongodb/MongoDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mongodb/MongoQueryRunner.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mongodb/typings.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mongodb/bson.typings.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/mysql/MysqlDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/oracle/OracleDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/postgres/PostgresDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/sap/SapDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/sqlite/SqliteDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/driver/sqlserver/SqlServerDriver.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/entity-manager/MongoEntityManager.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/logger/FileLogger.js": "./browser/platform/BrowserFileLoggerDummy.js", "./browser/platform/PlatformTools.js": "./browser/platform/BrowserPlatformTools.js", "./browser/repository/MongoRepository.js": "./browser/platform/BrowserDisabledDriversDummy.js", "./browser/util/DirectoryExportedClassesLoader.js": "./browser/platform/BrowserDirectoryExportedClassesLoader.js", "./index.js": "./browser/index.js", "./index.mjs": "./browser/index.js" }, "repository": { "type": "git", "url": "https://github.com/typeorm/typeorm.git" }, "bugs": { "url": "https://github.com/typeorm/typeorm/issues" }, "homepage": "https://typeorm.io", "tags": [ "orm", "typescript", "typescript-orm", "mysql", "mysql-orm", "postgresql", "postgresql-orm", "mariadb", "mariadb-orm", "spanner", "sqlite", "sqlite-orm", "sql-server", "sql-server-orm", "oracle", "oracle-orm", "cloud-spanner", "cloud-spanner-orm" ], "devDependencies": { "@types/app-root-path": "^1.2.4", "@types/chai": "^4.3.4", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", "@types/mkdirp": "^1.0.2", "@types/mocha": "^10.0.1", "@types/node": "^18.13.0", "@types/sha.js": "^2.4.0", "@types/sinon": "^10.0.13", "@types/source-map-support": "^0.5.6", "@types/uuid": "^9.0.0", "@types/yargs": "^17.0.22", "better-sqlite3": "^8.1.0", "chai": "^4.3.7", "chai-as-promised": "^7.1.1", "class-transformer": "^0.5.1", "conventional-changelog-angular": "^5.0.13", "conventional-changelog-cli": "^2.2.2", "del": "6.1.1", "gulp": "^4.0.2", "gulp-istanbul": "^1.1.3", "gulp-mocha": "^8.0.0", "gulp-rename": "^2.0.0", "gulp-replace": "^1.1.4", "gulp-shell": "^0.8.0", "gulp-sourcemaps": "^3.0.0", "gulp-typescript": "^6.0.0-alpha.1", "gulpclass": "^0.2.0", "husky": "^8.0.3", "mocha": "^10.2.0", "mongodb": "^5.2.0", "mssql": "^9.1.1", "mysql": "^2.18.1", "mysql2": "^3.1.1", "pg": "^8.9.0", "pg-query-stream": "^4.3.0", "prettier": "^2.8.3", "redis": "^4.6.4", "remap-istanbul": "^0.13.0", "rimraf": "^4.1.2", "sinon": "^15.0.1", "sinon-chai": "^3.7.0", "source-map-support": "^0.5.21", "sql.js": "^1.8.0", "sqlite3": "^5.1.4", "ts-node": "^10.9.1", "typeorm-aurora-data-api-driver": "^2.4.4", "typescript": "^4.9.5" }, "peerDependencies": { "@google-cloud/spanner": "^5.18.0", "@sap/hana-client": "^2.12.25", "better-sqlite3": "^7.1.2 || ^8.0.0", "hdb-pool": "^0.1.6", "ioredis": "^5.0.4", "mongodb": "^5.2.0", "mssql": "^9.1.1", "mysql2": "^2.2.5 || ^3.0.1", "oracledb": "^5.1.0", "pg": "^8.5.1", "pg-native": "^3.0.0", "pg-query-stream": "^4.0.0", "redis": "^3.1.1 || ^4.0.0", "sql.js": "^1.4.0", "sqlite3": "^5.0.3", "ts-node": "^10.7.0", "typeorm-aurora-data-api-driver": "^2.0.0" }, "peerDependenciesMeta": { "@google-cloud/spanner": { "optional": true }, "@sap/hana-client": { "optional": true }, "better-sqlite3": { "optional": true }, "hdb-pool": { "optional": true }, "ioredis": { "optional": true }, "mongodb": { "optional": true }, "mssql": { "optional": true }, "mysql2": { "optional": true }, "oracledb": { "optional": true }, "pg": { "optional": true }, "pg-native": { "optional": true }, "pg-query-stream": { "optional": true }, "redis": { "optional": true }, "sql.js": { "optional": true }, "sqlite3": { "optional": true }, "ts-node": { "optional": true }, "typeorm-aurora-data-api-driver": { "optional": true } }, "dependencies": { "@sqltools/formatter": "^1.2.5", "app-root-path": "^3.1.0", "buffer": "^6.0.3", "chalk": "^4.1.2", "cli-highlight": "^2.1.11", "date-fns": "^2.29.3", "debug": "^4.3.4", "dotenv": "^16.0.3", "glob": "^8.1.0", "mkdirp": "^2.1.3", "reflect-metadata": "^0.1.13", "sha.js": "^2.4.11", "tslib": "^2.5.0", "uuid": "^9.0.0", "yargs": "^17.6.2" }, "scripts": { "test": "rimraf ./build && tsc && mocha --file ./build/compiled/test/utils/test-setup.js --bail --recursive --timeout 90000 ./build/compiled/test", "test-fast": "mocha --file ./build/compiled/test/utils/test-setup.js --bail --recursive --timeout 90000 ./build/compiled/test", "compile": "rimraf ./build && tsc", "watch": "./node_modules/.bin/tsc -w", "package": "gulp package", "pack": "gulp pack", "lint": "prettier --check \"./src/**/*.ts\" \"./test/**/*.ts\" \"./sample/**/*.ts\"", "format": "prettier --write --end-of-line auto \"./src/**/*.ts\" \"./test/**/*.ts\" \"./sample/**/*.ts\"", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 2" }, "bin": { "typeorm": "./cli.js", "typeorm-ts-node-commonjs": "./cli-ts-node-commonjs.js", "typeorm-ts-node-esm": "./cli-ts-node-esm.js" }, "funding": "https://opencollective.com/typeorm", "collective": { "type": "opencollective", "url": "https://opencollective.com/typeorm", "logo": "https://opencollective.com/opencollective/logo.txt" }, "nyc": { "all": true, "cache": false, "exclude": [ "**/*.d.ts" ], "extension": [ ".ts" ], "include": [ "build/compiled/src/**", "src/**" ], "reporter": "json" } }
|
|
@@ -65,17 +65,9 @@ class EntityPersistExecutor {
|
|
|
65
65
|
: entity.constructor;
|
|
66
66
|
if (entityTarget === Object)
|
|
67
67
|
throw new CannotDetermineEntityError_1.CannotDetermineEntityError(this.mode);
|
|
68
|
-
let metadata = this.connection
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
// for an (abstract) base class and thus the target would not match.
|
|
72
|
-
if (metadata.inheritancePattern === "STI" &&
|
|
73
|
-
metadata.childEntityMetadatas.length > 0) {
|
|
74
|
-
const matchingChildMetadata = metadata.childEntityMetadatas.find((meta) => entity.constructor === meta.target);
|
|
75
|
-
if (matchingChildMetadata) {
|
|
76
|
-
metadata = matchingChildMetadata;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
68
|
+
let metadata = this.connection
|
|
69
|
+
.getMetadata(entityTarget)
|
|
70
|
+
.findInheritanceMetadata(entity);
|
|
79
71
|
subjects.push(new Subject_1.Subject({
|
|
80
72
|
metadata,
|
|
81
73
|
entity: entity,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/persistence/EntityPersistExecutor.ts"],"names":[],"mappings":"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","file":"EntityPersistExecutor.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { SaveOptions } from \"../repository/SaveOptions\"\nimport { RemoveOptions } from \"../repository/RemoveOptions\"\nimport { MustBeEntityError } from \"../error/MustBeEntityError\"\nimport { SubjectExecutor } from \"./SubjectExecutor\"\nimport { CannotDetermineEntityError } from \"../error/CannotDetermineEntityError\"\nimport { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { Subject } from \"./Subject\"\nimport { OneToManySubjectBuilder } from \"./subject-builder/OneToManySubjectBuilder\"\nimport { OneToOneInverseSideSubjectBuilder } from \"./subject-builder/OneToOneInverseSideSubjectBuilder\"\nimport { ManyToManySubjectBuilder } from \"./subject-builder/ManyToManySubjectBuilder\"\nimport { SubjectDatabaseEntityLoader } from \"./SubjectDatabaseEntityLoader\"\nimport { CascadesSubjectBuilder } from \"./subject-builder/CascadesSubjectBuilder\"\nimport { OrmUtils } from \"../util/OrmUtils\"\n\n/**\n * Persists a single entity or multiple entities - saves or removes them.\n */\nexport class EntityPersistExecutor {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(\n protected connection: DataSource,\n protected queryRunner: QueryRunner | undefined,\n protected mode: \"save\" | \"remove\" | \"soft-remove\" | \"recover\",\n protected target: Function | string | undefined,\n protected entity: ObjectLiteral | ObjectLiteral[],\n protected options?: SaveOptions & RemoveOptions,\n ) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Executes persistence operation ob given entity or entities.\n */\n async execute(): Promise<void> {\n // check if entity we are going to save is valid and is an object\n if (!this.entity || typeof this.entity !== \"object\")\n return Promise.reject(new MustBeEntityError(this.mode, this.entity))\n\n // we MUST call \"fake\" resolve here to make sure all properties of lazily loaded relations are resolved\n await Promise.resolve()\n\n // if query runner is already defined in this class, it means this entity manager was already created for a single connection\n // if its not defined we create a new query runner - single connection where we'll execute all our operations\n const queryRunner =\n this.queryRunner || this.connection.createQueryRunner()\n\n // save data in the query runner - this is useful functionality to share data from outside of the world\n // with third classes - like subscribers and listener methods\n let oldQueryRunnerData = queryRunner.data\n if (this.options && this.options.data) {\n queryRunner.data = this.options.data\n }\n\n try {\n // collect all operate subjects\n const entities: ObjectLiteral[] = Array.isArray(this.entity)\n ? this.entity\n : [this.entity]\n const entitiesInChunks =\n this.options && this.options.chunk && this.options.chunk > 0\n ? OrmUtils.chunk(entities, this.options.chunk)\n : [entities]\n\n // console.time(\"building subject executors...\");\n const executors = await Promise.all(\n entitiesInChunks.map(async (entities) => {\n const subjects: Subject[] = []\n\n // create subjects for all entities we received for the persistence\n entities.forEach((entity) => {\n const entityTarget = this.target\n ? this.target\n : entity.constructor\n if (entityTarget === Object)\n throw new CannotDetermineEntityError(this.mode)\n\n let metadata = this.connection.getMetadata(entityTarget)\n\n // Check for single table inheritance and find the correct metadata in that case.\n // Goal is to use the correct discriminator as we could have a repository\n // for an (abstract) base class and thus the target would not match.\n if (\n metadata.inheritancePattern === \"STI\" &&\n metadata.childEntityMetadatas.length > 0\n ) {\n const matchingChildMetadata =\n metadata.childEntityMetadatas.find(\n (meta) =>\n entity.constructor === meta.target,\n )\n if (matchingChildMetadata) {\n metadata = matchingChildMetadata\n }\n }\n\n subjects.push(\n new Subject({\n metadata,\n entity: entity,\n canBeInserted: this.mode === \"save\",\n canBeUpdated: this.mode === \"save\",\n mustBeRemoved: this.mode === \"remove\",\n canBeSoftRemoved: this.mode === \"soft-remove\",\n canBeRecovered: this.mode === \"recover\",\n }),\n )\n })\n\n // console.time(\"building cascades...\");\n // go through each entity with metadata and create subjects and subjects by cascades for them\n const cascadesSubjectBuilder = new CascadesSubjectBuilder(\n subjects,\n )\n subjects.forEach((subject) => {\n // next step we build list of subjects we will operate with\n // these subjects are subjects that we need to insert or update alongside with main persisted entity\n cascadesSubjectBuilder.build(subject, this.mode)\n })\n // console.timeEnd(\"building cascades...\");\n\n // load database entities for all subjects we have\n // next step is to load database entities for all operate subjects\n // console.time(\"loading...\");\n await new SubjectDatabaseEntityLoader(\n queryRunner,\n subjects,\n ).load(this.mode)\n // console.timeEnd(\"loading...\");\n\n // console.time(\"other subjects...\");\n // build all related subjects and change maps\n if (\n this.mode === \"save\" ||\n this.mode === \"soft-remove\" ||\n this.mode === \"recover\"\n ) {\n new OneToManySubjectBuilder(subjects).build()\n new OneToOneInverseSideSubjectBuilder(subjects).build()\n new ManyToManySubjectBuilder(subjects).build()\n } else {\n subjects.forEach((subject) => {\n if (subject.mustBeRemoved) {\n new ManyToManySubjectBuilder(\n subjects,\n ).buildForAllRemoval(subject)\n }\n })\n }\n // console.timeEnd(\"other subjects...\");\n // console.timeEnd(\"building subjects...\");\n // console.log(\"subjects\", subjects);\n\n // create a subject executor\n return new SubjectExecutor(\n queryRunner,\n subjects,\n this.options,\n )\n }),\n )\n // console.timeEnd(\"building subject executors...\");\n\n // make sure we have at least one executable operation before we create a transaction and proceed\n // if we don't have operations it means we don't really need to update or remove something\n const executorsWithExecutableOperations = executors.filter(\n (executor) => executor.hasExecutableOperations,\n )\n if (executorsWithExecutableOperations.length === 0) return\n\n // start execute queries in a transaction\n // if transaction is already opened in this query runner then we don't touch it\n // if its not opened yet then we open it here, and once we finish - we close it\n let isTransactionStartedByUs = false\n try {\n // open transaction if its not opened yet\n if (!queryRunner.isTransactionActive) {\n if (\n this.connection.driver.transactionSupport !== \"none\" &&\n (!this.options || this.options.transaction !== false)\n ) {\n // start transaction until it was not explicitly disabled\n isTransactionStartedByUs = true\n await queryRunner.startTransaction()\n }\n }\n\n // execute all persistence operations for all entities we have\n // console.time(\"executing subject executors...\");\n for (const executor of executorsWithExecutableOperations) {\n await executor.execute()\n }\n // console.timeEnd(\"executing subject executors...\");\n\n // commit transaction if it was started by us\n // console.time(\"commit\");\n if (isTransactionStartedByUs === true)\n await queryRunner.commitTransaction()\n // console.timeEnd(\"commit\");\n } catch (error) {\n // rollback transaction if it was started by us\n if (isTransactionStartedByUs) {\n try {\n await queryRunner.rollbackTransaction()\n } catch (rollbackError) {}\n }\n throw error\n }\n } finally {\n queryRunner.data = oldQueryRunnerData\n\n // release query runner only if its created by us\n if (!this.queryRunner) await queryRunner.release()\n }\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../../src/persistence/EntityPersistExecutor.ts"],"names":[],"mappings":"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","file":"EntityPersistExecutor.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { SaveOptions } from \"../repository/SaveOptions\"\nimport { RemoveOptions } from \"../repository/RemoveOptions\"\nimport { MustBeEntityError } from \"../error/MustBeEntityError\"\nimport { SubjectExecutor } from \"./SubjectExecutor\"\nimport { CannotDetermineEntityError } from \"../error/CannotDetermineEntityError\"\nimport { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { DataSource } from \"../data-source/DataSource\"\nimport { Subject } from \"./Subject\"\nimport { OneToManySubjectBuilder } from \"./subject-builder/OneToManySubjectBuilder\"\nimport { OneToOneInverseSideSubjectBuilder } from \"./subject-builder/OneToOneInverseSideSubjectBuilder\"\nimport { ManyToManySubjectBuilder } from \"./subject-builder/ManyToManySubjectBuilder\"\nimport { SubjectDatabaseEntityLoader } from \"./SubjectDatabaseEntityLoader\"\nimport { CascadesSubjectBuilder } from \"./subject-builder/CascadesSubjectBuilder\"\nimport { OrmUtils } from \"../util/OrmUtils\"\n\n/**\n * Persists a single entity or multiple entities - saves or removes them.\n */\nexport class EntityPersistExecutor {\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(\n protected connection: DataSource,\n protected queryRunner: QueryRunner | undefined,\n protected mode: \"save\" | \"remove\" | \"soft-remove\" | \"recover\",\n protected target: Function | string | undefined,\n protected entity: ObjectLiteral | ObjectLiteral[],\n protected options?: SaveOptions & RemoveOptions,\n ) {}\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Executes persistence operation ob given entity or entities.\n */\n async execute(): Promise<void> {\n // check if entity we are going to save is valid and is an object\n if (!this.entity || typeof this.entity !== \"object\")\n return Promise.reject(new MustBeEntityError(this.mode, this.entity))\n\n // we MUST call \"fake\" resolve here to make sure all properties of lazily loaded relations are resolved\n await Promise.resolve()\n\n // if query runner is already defined in this class, it means this entity manager was already created for a single connection\n // if its not defined we create a new query runner - single connection where we'll execute all our operations\n const queryRunner =\n this.queryRunner || this.connection.createQueryRunner()\n\n // save data in the query runner - this is useful functionality to share data from outside of the world\n // with third classes - like subscribers and listener methods\n let oldQueryRunnerData = queryRunner.data\n if (this.options && this.options.data) {\n queryRunner.data = this.options.data\n }\n\n try {\n // collect all operate subjects\n const entities: ObjectLiteral[] = Array.isArray(this.entity)\n ? this.entity\n : [this.entity]\n const entitiesInChunks =\n this.options && this.options.chunk && this.options.chunk > 0\n ? OrmUtils.chunk(entities, this.options.chunk)\n : [entities]\n\n // console.time(\"building subject executors...\");\n const executors = await Promise.all(\n entitiesInChunks.map(async (entities) => {\n const subjects: Subject[] = []\n\n // create subjects for all entities we received for the persistence\n entities.forEach((entity) => {\n const entityTarget = this.target\n ? this.target\n : entity.constructor\n if (entityTarget === Object)\n throw new CannotDetermineEntityError(this.mode)\n\n let metadata = this.connection\n .getMetadata(entityTarget)\n .findInheritanceMetadata(entity)\n\n subjects.push(\n new Subject({\n metadata,\n entity: entity,\n canBeInserted: this.mode === \"save\",\n canBeUpdated: this.mode === \"save\",\n mustBeRemoved: this.mode === \"remove\",\n canBeSoftRemoved: this.mode === \"soft-remove\",\n canBeRecovered: this.mode === \"recover\",\n }),\n )\n })\n\n // console.time(\"building cascades...\");\n // go through each entity with metadata and create subjects and subjects by cascades for them\n const cascadesSubjectBuilder = new CascadesSubjectBuilder(\n subjects,\n )\n subjects.forEach((subject) => {\n // next step we build list of subjects we will operate with\n // these subjects are subjects that we need to insert or update alongside with main persisted entity\n cascadesSubjectBuilder.build(subject, this.mode)\n })\n // console.timeEnd(\"building cascades...\");\n\n // load database entities for all subjects we have\n // next step is to load database entities for all operate subjects\n // console.time(\"loading...\");\n await new SubjectDatabaseEntityLoader(\n queryRunner,\n subjects,\n ).load(this.mode)\n // console.timeEnd(\"loading...\");\n\n // console.time(\"other subjects...\");\n // build all related subjects and change maps\n if (\n this.mode === \"save\" ||\n this.mode === \"soft-remove\" ||\n this.mode === \"recover\"\n ) {\n new OneToManySubjectBuilder(subjects).build()\n new OneToOneInverseSideSubjectBuilder(subjects).build()\n new ManyToManySubjectBuilder(subjects).build()\n } else {\n subjects.forEach((subject) => {\n if (subject.mustBeRemoved) {\n new ManyToManySubjectBuilder(\n subjects,\n ).buildForAllRemoval(subject)\n }\n })\n }\n // console.timeEnd(\"other subjects...\");\n // console.timeEnd(\"building subjects...\");\n // console.log(\"subjects\", subjects);\n\n // create a subject executor\n return new SubjectExecutor(\n queryRunner,\n subjects,\n this.options,\n )\n }),\n )\n // console.timeEnd(\"building subject executors...\");\n\n // make sure we have at least one executable operation before we create a transaction and proceed\n // if we don't have operations it means we don't really need to update or remove something\n const executorsWithExecutableOperations = executors.filter(\n (executor) => executor.hasExecutableOperations,\n )\n if (executorsWithExecutableOperations.length === 0) return\n\n // start execute queries in a transaction\n // if transaction is already opened in this query runner then we don't touch it\n // if its not opened yet then we open it here, and once we finish - we close it\n let isTransactionStartedByUs = false\n try {\n // open transaction if its not opened yet\n if (!queryRunner.isTransactionActive) {\n if (\n this.connection.driver.transactionSupport !== \"none\" &&\n (!this.options || this.options.transaction !== false)\n ) {\n // start transaction until it was not explicitly disabled\n isTransactionStartedByUs = true\n await queryRunner.startTransaction()\n }\n }\n\n // execute all persistence operations for all entities we have\n // console.time(\"executing subject executors...\");\n for (const executor of executorsWithExecutableOperations) {\n await executor.execute()\n }\n // console.timeEnd(\"executing subject executors...\");\n\n // commit transaction if it was started by us\n // console.time(\"commit\");\n if (isTransactionStartedByUs === true)\n await queryRunner.commitTransaction()\n // console.timeEnd(\"commit\");\n } catch (error) {\n // rollback transaction if it was started by us\n if (isTransactionStartedByUs) {\n try {\n await queryRunner.rollbackTransaction()\n } catch (rollbackError) {}\n }\n throw error\n }\n } finally {\n queryRunner.data = oldQueryRunnerData\n\n // release query runner only if its created by us\n if (!this.queryRunner) await queryRunner.release()\n }\n }\n}\n"],"sourceRoot":".."}
|
|
@@ -2,12 +2,14 @@ import { RelationMetadata } from "../metadata/RelationMetadata";
|
|
|
2
2
|
import { DataSource } from "../data-source/DataSource";
|
|
3
3
|
import { ObjectLiteral } from "../common/ObjectLiteral";
|
|
4
4
|
import { SelectQueryBuilder } from "./SelectQueryBuilder";
|
|
5
|
+
import { QueryRunner } from "../query-runner/QueryRunner";
|
|
5
6
|
/**
|
|
6
7
|
* Loads relation ids for the given entities.
|
|
7
8
|
*/
|
|
8
9
|
export declare class RelationIdLoader {
|
|
9
10
|
private connection;
|
|
10
|
-
|
|
11
|
+
protected queryRunner?: QueryRunner | undefined;
|
|
12
|
+
constructor(connection: DataSource, queryRunner?: QueryRunner | undefined);
|
|
11
13
|
/**
|
|
12
14
|
* Loads relation ids of the given entity or entities.
|
|
13
15
|
*/
|
|
@@ -9,8 +9,9 @@ class RelationIdLoader {
|
|
|
9
9
|
// -------------------------------------------------------------------------
|
|
10
10
|
// Constructor
|
|
11
11
|
// -------------------------------------------------------------------------
|
|
12
|
-
constructor(connection) {
|
|
12
|
+
constructor(connection, queryRunner) {
|
|
13
13
|
this.connection = connection;
|
|
14
|
+
this.queryRunner = queryRunner;
|
|
14
15
|
}
|
|
15
16
|
// -------------------------------------------------------------------------
|
|
16
17
|
// Public Methods
|
|
@@ -52,7 +53,7 @@ class RelationIdLoader {
|
|
|
52
53
|
? entitiesOrEntities
|
|
53
54
|
: [entitiesOrEntities];
|
|
54
55
|
if (!relatedEntityOrEntities) {
|
|
55
|
-
relatedEntityOrEntities = await this.connection.relationLoader.load(relation, entitiesOrEntities,
|
|
56
|
+
relatedEntityOrEntities = await this.connection.relationLoader.load(relation, entitiesOrEntities, this.queryRunner, queryBuilder);
|
|
56
57
|
if (!relatedEntityOrEntities.length)
|
|
57
58
|
return entities.map((entity) => ({
|
|
58
59
|
entity: entity,
|
|
@@ -173,7 +174,7 @@ class RelationIdLoader {
|
|
|
173
174
|
const inverseColumns = relation.isOwning
|
|
174
175
|
? junctionMetadata.inverseColumns
|
|
175
176
|
: junctionMetadata.ownerColumns;
|
|
176
|
-
const qb = this.connection.createQueryBuilder();
|
|
177
|
+
const qb = this.connection.createQueryBuilder(this.queryRunner);
|
|
177
178
|
// select all columns from junction table
|
|
178
179
|
columns.forEach((column) => {
|
|
179
180
|
const columnName = DriverUtils_1.DriverUtils.buildAlias(this.connection.driver, undefined, column.referencedColumn.entityMetadata.name +
|
|
@@ -350,7 +351,7 @@ class RelationIdLoader {
|
|
|
350
351
|
return Promise.resolve(relationIdMaps);
|
|
351
352
|
}
|
|
352
353
|
// select all columns we need
|
|
353
|
-
const qb = this.connection.createQueryBuilder();
|
|
354
|
+
const qb = this.connection.createQueryBuilder(this.queryRunner);
|
|
354
355
|
relation.entityMetadata.primaryColumns.forEach((primaryColumn) => {
|
|
355
356
|
const columnName = DriverUtils_1.DriverUtils.buildAlias(this.connection.driver, undefined, primaryColumn.entityMetadata.name +
|
|
356
357
|
"_" +
|
|
@@ -439,7 +440,7 @@ class RelationIdLoader {
|
|
|
439
440
|
}
|
|
440
441
|
const mainAlias = relation.entityMetadata.targetName;
|
|
441
442
|
// select all columns we need
|
|
442
|
-
const qb = this.connection.createQueryBuilder();
|
|
443
|
+
const qb = this.connection.createQueryBuilder(this.queryRunner);
|
|
443
444
|
relation.entityMetadata.primaryColumns.forEach((primaryColumn) => {
|
|
444
445
|
const columnName = DriverUtils_1.DriverUtils.buildAlias(this.connection.driver, undefined, primaryColumn.entityMetadata.name +
|
|
445
446
|
"_" +
|