typeorm 0.3.25-dev.eb3093d → 0.3.26-dev.01dddfe
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/README.md +9 -9
- package/browser/connection/ConnectionOptionsReader.js +1 -1
- package/browser/connection/ConnectionOptionsReader.js.map +1 -1
- package/browser/connection/options-reader/ConnectionOptionsEnvReader.d.ts +1 -1
- package/browser/connection/options-reader/ConnectionOptionsEnvReader.js +1 -1
- package/browser/connection/options-reader/ConnectionOptionsEnvReader.js.map +1 -1
- package/browser/driver/aurora-mysql/AuroraMysqlDriver.d.ts +1 -1
- package/browser/driver/aurora-mysql/AuroraMysqlQueryRunner.js +11 -20
- package/browser/driver/aurora-mysql/AuroraMysqlQueryRunner.js.map +1 -1
- package/browser/driver/better-sqlite3/BetterSqlite3Driver.js +2 -2
- package/browser/driver/better-sqlite3/BetterSqlite3Driver.js.map +1 -1
- package/browser/driver/better-sqlite3/BetterSqlite3QueryRunner.js +3 -3
- package/browser/driver/better-sqlite3/BetterSqlite3QueryRunner.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachDriver.js +3 -2
- package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/browser/driver/cordova/CordovaQueryRunner.js +1 -1
- package/browser/driver/cordova/CordovaQueryRunner.js.map +1 -1
- package/browser/driver/expo/legacy/ExpoLegacyQueryRunner.js +1 -1
- package/browser/driver/expo/legacy/ExpoLegacyQueryRunner.js.map +1 -1
- package/browser/driver/mongodb/MongoDriver.d.ts +1 -1
- package/browser/driver/mongodb/MongoDriver.js +4 -4
- package/browser/driver/mongodb/MongoDriver.js.map +1 -1
- package/browser/driver/mongodb/bson.typings.d.ts +0 -4
- package/browser/driver/mongodb/bson.typings.js +1 -1
- package/browser/driver/mongodb/bson.typings.js.map +1 -1
- package/browser/driver/mongodb/typings.d.ts +7 -10
- package/browser/driver/mongodb/typings.js +2 -2
- package/browser/driver/mongodb/typings.js.map +1 -1
- package/browser/driver/mysql/MysqlDriver.d.ts +1 -1
- package/browser/driver/mysql/MysqlDriver.js +3 -2
- package/browser/driver/mysql/MysqlDriver.js.map +1 -1
- package/browser/driver/mysql/MysqlQueryRunner.js +1 -1
- package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
- package/browser/driver/nativescript/NativescriptQueryRunner.js +1 -1
- package/browser/driver/nativescript/NativescriptQueryRunner.js.map +1 -1
- package/browser/driver/oracle/OracleDriver.js +3 -7
- package/browser/driver/oracle/OracleDriver.js.map +1 -1
- package/browser/driver/postgres/PostgresDriver.js +4 -5
- package/browser/driver/postgres/PostgresDriver.js.map +1 -1
- package/browser/driver/react-native/ReactNativeDriver.d.ts +1 -1
- package/browser/driver/react-native/ReactNativeQueryRunner.js +1 -1
- package/browser/driver/react-native/ReactNativeQueryRunner.js.map +1 -1
- package/browser/driver/sap/SapDriver.d.ts +1 -1
- package/browser/driver/sap/SapDriver.js +47 -40
- package/browser/driver/sap/SapDriver.js.map +1 -1
- package/browser/driver/sap/SapQueryRunner.js +22 -37
- package/browser/driver/sap/SapQueryRunner.js.map +1 -1
- package/browser/driver/spanner/SpannerDriver.d.ts +1 -1
- package/browser/driver/sqlite/SqliteDriver.js +1 -1
- package/browser/driver/sqlite/SqliteDriver.js.map +1 -1
- package/browser/driver/sqlite-abstract/AbstractSqliteDriver.d.ts +2 -2
- package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js +1 -1
- package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
- package/browser/driver/sqljs/SqljsDriver.d.ts +2 -1
- package/browser/driver/sqlserver/SqlServerDriver.js +3 -2
- package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
- package/browser/driver/types/ColumnTypes.d.ts +1 -1
- package/browser/driver/types/ColumnTypes.js.map +1 -1
- package/browser/entity-manager/EntityManager.d.ts +1 -1
- package/browser/entity-manager/EntityManager.js +1 -1
- package/browser/entity-manager/EntityManager.js.map +1 -1
- package/browser/entity-manager/MongoEntityManager.js +3 -3
- package/browser/entity-manager/MongoEntityManager.js.map +1 -1
- package/browser/error/InitializedRelationError.d.ts +1 -1
- package/browser/error/InitializedRelationError.js +1 -1
- package/browser/error/InitializedRelationError.js.map +1 -1
- package/browser/logger/FormattedConsoleLogger.js +1 -1
- package/browser/logger/FormattedConsoleLogger.js.map +1 -1
- package/browser/metadata/ColumnMetadata.d.ts +3 -3
- package/browser/metadata/ColumnMetadata.js +1 -1
- package/browser/metadata/ColumnMetadata.js.map +1 -1
- package/browser/metadata-builder/ClosureJunctionEntityMetadataBuilder.js +14 -0
- package/browser/metadata-builder/ClosureJunctionEntityMetadataBuilder.js.map +1 -1
- package/browser/metadata-builder/EntityMetadataValidator.js +2 -4
- package/browser/metadata-builder/EntityMetadataValidator.js.map +1 -1
- package/browser/metadata-builder/RelationJoinColumnBuilder.js +7 -0
- package/browser/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
- package/browser/persistence/SubjectChangedColumnsComputer.js +4 -4
- package/browser/persistence/SubjectChangedColumnsComputer.js.map +1 -1
- package/browser/persistence/SubjectExecutor.js +4 -10
- package/browser/persistence/SubjectExecutor.js.map +1 -1
- package/browser/persistence/SubjectTopologicalSorter.js +5 -4
- package/browser/persistence/SubjectTopologicalSorter.js.map +1 -1
- package/browser/query-builder/RelationLoader.js +2 -0
- package/browser/query-builder/RelationLoader.js.map +1 -1
- package/browser/query-builder/transformer/RawSqlResultsToEntityTransformer.js.map +1 -1
- package/browser/query-runner/QueryLock.js +1 -0
- package/browser/query-runner/QueryLock.js.map +1 -1
- package/browser/util/ImportUtils.d.ts +1 -1
- package/browser/util/ImportUtils.js +2 -1
- package/browser/util/ImportUtils.js.map +1 -1
- package/browser/util/OrmUtils.d.ts +11 -10
- package/browser/util/OrmUtils.js +31 -31
- package/browser/util/OrmUtils.js.map +1 -1
- package/cli.js +3 -1
- package/cli.js.map +1 -1
- package/connection/ConnectionOptionsReader.js +1 -1
- package/connection/ConnectionOptionsReader.js.map +1 -1
- package/connection/options-reader/ConnectionOptionsEnvReader.d.ts +1 -1
- package/connection/options-reader/ConnectionOptionsEnvReader.js +1 -1
- package/connection/options-reader/ConnectionOptionsEnvReader.js.map +1 -1
- package/driver/aurora-mysql/AuroraMysqlDriver.d.ts +1 -1
- package/driver/aurora-mysql/AuroraMysqlQueryRunner.js +11 -20
- package/driver/aurora-mysql/AuroraMysqlQueryRunner.js.map +1 -1
- package/driver/better-sqlite3/BetterSqlite3Driver.js +2 -2
- package/driver/better-sqlite3/BetterSqlite3Driver.js.map +1 -1
- package/driver/better-sqlite3/BetterSqlite3QueryRunner.js +3 -3
- package/driver/better-sqlite3/BetterSqlite3QueryRunner.js.map +1 -1
- package/driver/cockroachdb/CockroachDriver.js +3 -2
- package/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/driver/cordova/CordovaQueryRunner.js +1 -1
- package/driver/cordova/CordovaQueryRunner.js.map +1 -1
- package/driver/expo/legacy/ExpoLegacyQueryRunner.js +1 -1
- package/driver/expo/legacy/ExpoLegacyQueryRunner.js.map +1 -1
- package/driver/mongodb/MongoDriver.d.ts +1 -1
- package/driver/mongodb/MongoDriver.js +4 -4
- package/driver/mongodb/MongoDriver.js.map +1 -1
- package/driver/mongodb/bson.typings.d.ts +0 -4
- package/driver/mongodb/bson.typings.js +0 -1
- package/driver/mongodb/bson.typings.js.map +1 -1
- package/driver/mongodb/typings.d.ts +7 -10
- package/driver/mongodb/typings.js +3 -2
- package/driver/mongodb/typings.js.map +1 -1
- package/driver/mysql/MysqlDriver.d.ts +1 -1
- package/driver/mysql/MysqlDriver.js +3 -2
- package/driver/mysql/MysqlDriver.js.map +1 -1
- package/driver/mysql/MysqlQueryRunner.js +1 -1
- package/driver/mysql/MysqlQueryRunner.js.map +1 -1
- package/driver/nativescript/NativescriptQueryRunner.js +1 -1
- package/driver/nativescript/NativescriptQueryRunner.js.map +1 -1
- package/driver/oracle/OracleDriver.js +3 -7
- package/driver/oracle/OracleDriver.js.map +1 -1
- package/driver/postgres/PostgresDriver.js +4 -5
- package/driver/postgres/PostgresDriver.js.map +1 -1
- package/driver/react-native/ReactNativeDriver.d.ts +1 -1
- package/driver/react-native/ReactNativeQueryRunner.js +1 -1
- package/driver/react-native/ReactNativeQueryRunner.js.map +1 -1
- package/driver/sap/SapDriver.d.ts +1 -1
- package/driver/sap/SapDriver.js +47 -40
- package/driver/sap/SapDriver.js.map +1 -1
- package/driver/sap/SapQueryRunner.js +22 -37
- package/driver/sap/SapQueryRunner.js.map +1 -1
- package/driver/spanner/SpannerDriver.d.ts +1 -1
- package/driver/sqlite/SqliteDriver.js +1 -1
- package/driver/sqlite/SqliteDriver.js.map +1 -1
- package/driver/sqlite-abstract/AbstractSqliteDriver.d.ts +2 -2
- package/driver/sqlite-abstract/AbstractSqliteDriver.js +1 -1
- package/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
- package/driver/sqljs/SqljsDriver.d.ts +2 -1
- package/driver/sqlserver/SqlServerDriver.js +3 -2
- package/driver/sqlserver/SqlServerDriver.js.map +1 -1
- package/driver/types/ColumnTypes.d.ts +1 -1
- package/driver/types/ColumnTypes.js.map +1 -1
- package/entity-manager/EntityManager.d.ts +1 -1
- package/entity-manager/EntityManager.js +1 -1
- package/entity-manager/EntityManager.js.map +1 -1
- package/entity-manager/MongoEntityManager.js +3 -3
- package/entity-manager/MongoEntityManager.js.map +1 -1
- package/error/InitializedRelationError.d.ts +1 -1
- package/error/InitializedRelationError.js +1 -1
- package/error/InitializedRelationError.js.map +1 -1
- package/index.mjs +2 -2
- package/logger/FormattedConsoleLogger.js +1 -1
- package/logger/FormattedConsoleLogger.js.map +1 -1
- package/metadata/ColumnMetadata.d.ts +3 -3
- package/metadata/ColumnMetadata.js +1 -1
- package/metadata/ColumnMetadata.js.map +1 -1
- package/metadata-builder/ClosureJunctionEntityMetadataBuilder.js +14 -0
- package/metadata-builder/ClosureJunctionEntityMetadataBuilder.js.map +1 -1
- package/metadata-builder/EntityMetadataValidator.js +2 -4
- package/metadata-builder/EntityMetadataValidator.js.map +1 -1
- package/metadata-builder/RelationJoinColumnBuilder.js +7 -0
- package/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
- package/package.json +1 -1
- package/persistence/SubjectChangedColumnsComputer.js +4 -4
- package/persistence/SubjectChangedColumnsComputer.js.map +1 -1
- package/persistence/SubjectExecutor.js +4 -10
- package/persistence/SubjectExecutor.js.map +1 -1
- package/persistence/SubjectTopologicalSorter.js +5 -4
- package/persistence/SubjectTopologicalSorter.js.map +1 -1
- package/query-builder/RelationLoader.js +2 -0
- package/query-builder/RelationLoader.js.map +1 -1
- package/query-builder/transformer/RawSqlResultsToEntityTransformer.js.map +1 -1
- package/query-runner/QueryLock.js +1 -0
- package/query-runner/QueryLock.js.map +1 -1
- package/util/ImportUtils.d.ts +1 -1
- package/util/ImportUtils.js +2 -1
- package/util/ImportUtils.js.map +1 -1
- package/util/OrmUtils.d.ts +11 -10
- package/util/OrmUtils.js +31 -31
- package/util/OrmUtils.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../browser/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 // 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":".."}
|
|
1
|
+
{"version":3,"sources":["../browser/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\"\nimport { OrmUtils } from \"../util/OrmUtils\"\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 } else if (relationalColumn.referencedColumn) {\n // Clone the relational column to prevent modifying the original when multiple\n // relations reference the same column. This ensures each relation gets its own\n // copy with independent referencedColumn and type properties.\n relationalColumn = OrmUtils.cloneObject(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,7 +1,7 @@
|
|
|
1
|
-
import { DateUtils } from "../util/DateUtils";
|
|
2
|
-
import { OrmUtils } from "../util/OrmUtils";
|
|
3
1
|
import { ApplyValueTransformers } from "../util/ApplyValueTransformers";
|
|
2
|
+
import { DateUtils } from "../util/DateUtils";
|
|
4
3
|
import { ObjectUtils } from "../util/ObjectUtils";
|
|
4
|
+
import { OrmUtils } from "../util/OrmUtils";
|
|
5
5
|
/**
|
|
6
6
|
* Finds what columns are changed in the subject entities.
|
|
7
7
|
*/
|
|
@@ -59,8 +59,8 @@ export class SubjectChangedColumnsComputer {
|
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
let normalizedValue = entityValue;
|
|
62
|
-
// normalize special values to make proper comparision
|
|
63
|
-
if (entityValue !== null) {
|
|
62
|
+
// if both values are not null, normalize special values to make proper comparision
|
|
63
|
+
if (entityValue !== null && databaseValue !== null) {
|
|
64
64
|
switch (column.type) {
|
|
65
65
|
case "date":
|
|
66
66
|
normalizedValue = column.isArray
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../browser/src/persistence/SubjectChangedColumnsComputer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD;;GAEG;AACH,MAAM,OAAO,6BAA6B;IACtC,4EAA4E;IAC5E,iBAAiB;IACjB,4EAA4E;IAE5E;;OAEG;IACH,OAAO,CAAC,QAAmB;QACvB,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACzB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;YAChC,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACN,CAAC;IAED,4EAA4E;IAC5E,oBAAoB;IACpB,4EAA4E;IAE5E;;OAEG;IACO,kBAAkB,CAAC,OAAgB;QACzC,wEAAwE;QACxE,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAM;QAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACxC,yBAAyB;YACzB,IACI,MAAM,CAAC,SAAS;gBAChB,MAAM,CAAC,eAAe,CAAC,KAAK;YAC5B,yBAAyB;YACzB,sBAAsB;YACtB,sBAAsB;;gBAEtB,OAAM;YAEV,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CACrC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM,CAC7C,CAAA;YACD,IAAI,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,UAAU,CAAC,MAAM,CACrB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EACrC,CAAC,CACJ,CAAA;YACL,CAAC;YAED,iFAAiF;YACjF,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAO,CAAC,CAAA;YAE1D,yFAAyF;YACzF,IAAI,WAAW,KAAK,SAAS;gBAAE,OAAM;YAErC,mFAAmF;YACnF,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBACzB,yEAAyE;gBACzE,MAAM,6BAA6B,GAC/B,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAA;gBAErD,mCAAmC;gBACnC,IAAI,aAAa,GAAG,MAAM,CAAC,cAAc,CACrC,OAAO,CAAC,cAAc,EACtB,6BAA6B,CAChC,CAAA;gBAED,2FAA2F;gBAC3F,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;oBAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAChD,OAAO,CAAC,MAAO,CAClB,CAAA;oBACD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;wBAAE,OAAM;gBACrD,CAAC;gBACD,IAAI,eAAe,GAAG,WAAW,CAAA;gBACjC,sDAAsD;gBACtD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;oBACvB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;wBAClB,KAAK,MAAM;4BACP,eAAe,GAAG,MAAM,CAAC,OAAO;gCAC5B,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE,CAC3B,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,CACxC;gCACH,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAA;4BAClD,aAAa,GAAG,MAAM,CAAC,OAAO;gCAC1B,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE,CAC7B,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,CACxC;gCACH,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;4BACpD,MAAK;wBAET,KAAK,MAAM,CAAC;wBACZ,KAAK,qBAAqB,CAAC;wBAC3B,KAAK,wBAAwB,CAAC;wBAC9B,KAAK,QAAQ;4BACT,eAAe,GAAG,MAAM,CAAC,OAAO;gCAC5B,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE,CAC3B,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,CACxC;gCACH,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAA;4BAClD,aAAa,GAAG,MAAM,CAAC,OAAO;gCAC1B,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE,CAC7B,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,CACxC;gCACH,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;4BACpD,MAAK;wBAET,KAAK,UAAU,CAAC;wBAChB,KAAK,WAAW,CAAC;wBACjB,KAAK,IAAI,CAAC;wBACV,KAAK,WAAW,CAAC;wBACjB,KAAK,6BAA6B,CAAC;wBACnC,KAAK,0BAA0B,CAAC;wBAChC,KAAK,gCAAgC,CAAC;wBACtC,KAAK,aAAa;4BACd,eAAe,GAAG,MAAM,CAAC,OAAO;gCAC5B,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE,CAC3B,SAAS,CAAC,4BAA4B,CAClC,IAAI,CACP,CACJ;gCACH,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAClC,WAAW,CACd,CAAA;4BAEP,aAAa,GAAG,MAAM,CAAC,OAAO;gCAC1B,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE,CAC7B,SAAS,CAAC,4BAA4B,CAClC,IAAI,CACP,CACJ;gCACH,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAClC,aAAa,CAChB,CAAA;4BAEP,MAAK;wBAET,KAAK,MAAM,CAAC;wBACZ,KAAK,OAAO;4BACR,0EAA0E;4BAC1E,2FAA2F;4BAC3F,sFAAsF;4BACtF,IACI,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,aAAa,CAAC;gCAEhD,OAAM;4BACV,MAAK;wBAET,KAAK,cAAc;4BACf,eAAe;gCACX,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAA;4BAC9C,aAAa;gCACT,SAAS,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAA;4BAChD,MAAK;wBACT,KAAK,aAAa;4BACd,eAAe;gCACX,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAA;4BAC7C,aAAa;gCACT,SAAS,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAA;4BAC/C,MAAK;wBACT,KAAK,aAAa;4BACd,eAAe;gCACX,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAA;4BAC7C,aAAa;gCACT,SAAS,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAA;4BAC/C,MAAK;oBACb,CAAC;oBAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;wBACrB,eAAe,GAAG,sBAAsB,CAAC,WAAW,CAChD,MAAM,CAAC,WAAW,EAClB,WAAW,CACd,CAAA;oBACL,CAAC;gBACL,CAAC;gBAED,4CAA4C;gBAC5C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,IAAI,QAAQ,CAAC,WAAW,CAAC,eAAe,EAAE,aAAa,CAAC;wBACpD,OAAM;gBACd,CAAC;qBAAM,IACH,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;oBAChC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAChC,CAAC;oBACC,IAAI,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;wBACxC,OAAM;oBACV,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,IAAI,eAAe,KAAK,aAAa;wBAAE,OAAM;gBACjD,CAAC;YACL,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACrC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAEpC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;gBACpB,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,WAAW;aACrB,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;OAEG;IACO,4BAA4B,CAClC,WAAsB,EACtB,OAAgB;QAEhB,wEAAwE;QACxE,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAM;QAE3B,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC3D,mDAAmD;YACnD,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAO,CAAC,CAAA;YAE5D,yFAAyF;YACzF,IAAI,aAAa,KAAK,SAAS;gBAAE,OAAM;YAEvC,8FAA8F;YAC9F,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBACzB,+BAA+B;gBAC/B,+DAA+D;gBAC/D,6CAA6C;gBAC7C,0EAA0E;gBAC1E,gEAAgE;gBAChE,IAAI,0BAA0B,GAAkB,aAAa,CAAA;gBAC7D,IACI,0BAA0B,KAAK,IAAI;oBACnC,WAAW,CAAC,QAAQ,CAAC,0BAA0B,CAAC;oBAEhD,0BAA0B,GAAG,QAAQ,CAAC,gBAAgB,CAClD,0BAA0B,CAC5B,CAAA;gBAEN,gFAAgF;gBAChF,oDAAoD;gBACpD,MAAM,kCAAkC,GACpC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;gBAEnD,kEAAkE;gBAClE,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAC1C,0BAA0B,EAC1B,kCAAkC,CACrC,CAAA;gBACD,IAAI,kBAAkB,EAAE,CAAC;oBACrB,OAAM;gBACV,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACxC,CAAC;YACL,CAAC;YAED,+GAA+G;YAC/G,0GAA0G;YAC1G,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CACjC,CAAC,OAAO,EAAE,EAAE,CACR,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa,CACjE,CAAA;YACD,IAAI,YAAY;gBAAE,aAAa,GAAG,YAAY,CAAA;YAE9C,oDAAoD;YACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CACrC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CACjD,CAAA;YACD,IAAI,SAAS,EAAE,CAAC;gBACZ,uCAAuC;gBACvC,SAAS,CAAC,KAAK,GAAG,aAAa,CAAA;YACnC,CAAC;iBAAM,CAAC;gBACJ,mDAAmD;gBACnD,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;oBACpB,QAAQ,EAAE,QAAQ;oBAClB,KAAK,EAAE,aAAa;iBACvB,CAAC,CAAA;YACN,CAAC;QACL,CAAC,CAAC,CAAA;IACN,CAAC;CACJ","file":"SubjectChangedColumnsComputer.js","sourcesContent":["import { Subject } from \"./Subject\"\nimport { DateUtils } from \"../util/DateUtils\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { OrmUtils } from \"../util/OrmUtils\"\nimport { ApplyValueTransformers } from \"../util/ApplyValueTransformers\"\nimport { ObjectUtils } from \"../util/ObjectUtils\"\n\n/**\n * Finds what columns are changed in the subject entities.\n */\nexport class SubjectChangedColumnsComputer {\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Finds what columns are changed in the subject entities.\n */\n compute(subjects: Subject[]) {\n subjects.forEach((subject) => {\n this.computeDiffColumns(subject)\n this.computeDiffRelationalColumns(subjects, subject)\n })\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Differentiate columns from the updated entity and entity stored in the database.\n */\n protected computeDiffColumns(subject: Subject): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.columns.forEach((column) => {\n // ignore special columns\n if (\n column.isVirtual ||\n column.isDiscriminator // ||\n // column.isUpdateDate ||\n // column.isVersion ||\n // column.isCreateDate\n )\n return\n\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.column === column,\n )\n if (changeMap) {\n subject.changeMaps.splice(\n subject.changeMaps.indexOf(changeMap),\n 1,\n )\n }\n\n // get user provided value - column value from the user provided persisted entity\n const entityValue = column.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (entityValue === undefined) return\n\n // if there is no database entity then all columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // skip transform database value for json / jsonb for comparison later on\n const shouldTransformDatabaseEntity =\n column.type !== \"json\" && column.type !== \"jsonb\"\n\n // get database value of the column\n let databaseValue = column.getEntityValue(\n subject.databaseEntity,\n shouldTransformDatabaseEntity,\n )\n\n // filter out \"relational columns\" only in the case if there is a relation object in entity\n if (column.relationMetadata) {\n const value = column.relationMetadata.getEntityValue(\n subject.entity!,\n )\n if (value !== null && value !== undefined) return\n }\n let normalizedValue = entityValue\n // normalize special values to make proper comparision\n if (entityValue !== null) {\n switch (column.type) {\n case \"date\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(databaseValue)\n break\n\n case \"time\":\n case \"time with time zone\":\n case \"time without time zone\":\n case \"timetz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(databaseValue)\n break\n\n case \"datetime\":\n case \"datetime2\":\n case Date:\n case \"timestamp\":\n case \"timestamp without time zone\":\n case \"timestamp with time zone\":\n case \"timestamp with local time zone\":\n case \"timestamptz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n entityValue,\n )\n\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n databaseValue,\n )\n\n break\n\n case \"json\":\n case \"jsonb\":\n // JSON.stringify doesn't work because postgresql sorts jsonb before save.\n // If you try to save json '[{\"messages\": \"\", \"attribute Key\": \"\", \"level\":\"\"}] ' as jsonb,\n // then postgresql will save it as '[{\"level\": \"\", \"message\":\"\", \"attributeKey\": \"\"}]'\n if (\n OrmUtils.deepCompare(entityValue, databaseValue)\n )\n return\n break\n\n case \"simple-array\":\n normalizedValue =\n DateUtils.simpleArrayToString(entityValue)\n databaseValue =\n DateUtils.simpleArrayToString(databaseValue)\n break\n case \"simple-enum\":\n normalizedValue =\n DateUtils.simpleEnumToString(entityValue)\n databaseValue =\n DateUtils.simpleEnumToString(databaseValue)\n break\n case \"simple-json\":\n normalizedValue =\n DateUtils.simpleJsonToString(entityValue)\n databaseValue =\n DateUtils.simpleJsonToString(databaseValue)\n break\n }\n\n if (column.transformer) {\n normalizedValue = ApplyValueTransformers.transformTo(\n column.transformer,\n entityValue,\n )\n }\n }\n\n // if value is not changed - then do nothing\n if (column.isArray) {\n if (OrmUtils.deepCompare(normalizedValue, databaseValue))\n return\n } else if (\n Buffer.isBuffer(normalizedValue) &&\n Buffer.isBuffer(databaseValue)\n ) {\n if (normalizedValue.equals(databaseValue)) {\n return\n }\n } else {\n if (normalizedValue === databaseValue) return\n }\n }\n\n if (!subject.diffColumns.includes(column))\n subject.diffColumns.push(column)\n\n subject.changeMaps.push({\n column: column,\n value: entityValue,\n })\n })\n }\n\n /**\n * Difference columns of the owning one-to-one and many-to-one columns.\n */\n protected computeDiffRelationalColumns(\n allSubjects: Subject[],\n subject: Subject,\n ): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.relationsWithJoinColumns.forEach((relation) => {\n // get the related entity from the persisted entity\n let relatedEntity = relation.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (relatedEntity === undefined) return\n\n // if there is no database entity then all relational columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // here we cover two scenarios:\n // 1. related entity can be another entity which is natural way\n // 2. related entity can be just an entity id\n // if relation entity is just a relation id set (for example post.tag = 1)\n // then we create an id map from it to make a proper comparision\n let relatedEntityRelationIdMap: ObjectLiteral = relatedEntity\n if (\n relatedEntityRelationIdMap !== null &&\n ObjectUtils.isObject(relatedEntityRelationIdMap)\n )\n relatedEntityRelationIdMap = relation.getRelationIdMap(\n relatedEntityRelationIdMap,\n )!\n\n // get database related entity. Since loadRelationIds are used on databaseEntity\n // related entity will contain only its relation ids\n const databaseRelatedEntityRelationIdMap =\n relation.getEntityValue(subject.databaseEntity)\n\n // if relation ids are equal then we don't need to update anything\n const areRelatedIdsEqual = OrmUtils.compareIds(\n relatedEntityRelationIdMap,\n databaseRelatedEntityRelationIdMap,\n )\n if (areRelatedIdsEqual) {\n return\n } else {\n subject.diffRelations.push(relation)\n }\n }\n\n // if there is an inserted subject for the related entity of the persisted entity then use it as related entity\n // this code is used for related entities without ids to be properly inserted (and then updated if needed)\n const valueSubject = allSubjects.find(\n (subject) =>\n subject.mustBeInserted && subject.entity === relatedEntity,\n )\n if (valueSubject) relatedEntity = valueSubject\n\n // find if there is already a relation to be changed\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.relation === relation,\n )\n if (changeMap) {\n // and update its value if it was found\n changeMap.value = relatedEntity\n } else {\n // if it wasn't found add a new relation for change\n subject.changeMaps.push({\n relation: relation,\n value: relatedEntity,\n })\n }\n })\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../browser/src/persistence/SubjectChangedColumnsComputer.ts"],"names":[],"mappings":"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","file":"SubjectChangedColumnsComputer.js","sourcesContent":["import { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { ApplyValueTransformers } from \"../util/ApplyValueTransformers\"\nimport { DateUtils } from \"../util/DateUtils\"\nimport { ObjectUtils } from \"../util/ObjectUtils\"\nimport { OrmUtils } from \"../util/OrmUtils\"\nimport { Subject } from \"./Subject\"\n\n/**\n * Finds what columns are changed in the subject entities.\n */\nexport class SubjectChangedColumnsComputer {\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Finds what columns are changed in the subject entities.\n */\n compute(subjects: Subject[]) {\n subjects.forEach((subject) => {\n this.computeDiffColumns(subject)\n this.computeDiffRelationalColumns(subjects, subject)\n })\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Differentiate columns from the updated entity and entity stored in the database.\n */\n protected computeDiffColumns(subject: Subject): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.columns.forEach((column) => {\n // ignore special columns\n if (\n column.isVirtual ||\n column.isDiscriminator // ||\n // column.isUpdateDate ||\n // column.isVersion ||\n // column.isCreateDate\n )\n return\n\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.column === column,\n )\n if (changeMap) {\n subject.changeMaps.splice(\n subject.changeMaps.indexOf(changeMap),\n 1,\n )\n }\n\n // get user provided value - column value from the user provided persisted entity\n const entityValue = column.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (entityValue === undefined) return\n\n // if there is no database entity then all columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // skip transform database value for json / jsonb for comparison later on\n const shouldTransformDatabaseEntity =\n column.type !== \"json\" && column.type !== \"jsonb\"\n\n // get database value of the column\n let databaseValue = column.getEntityValue(\n subject.databaseEntity,\n shouldTransformDatabaseEntity,\n )\n\n // filter out \"relational columns\" only in the case if there is a relation object in entity\n if (column.relationMetadata) {\n const value = column.relationMetadata.getEntityValue(\n subject.entity!,\n )\n if (value !== null && value !== undefined) return\n }\n let normalizedValue = entityValue\n // if both values are not null, normalize special values to make proper comparision\n if (entityValue !== null && databaseValue !== null) {\n switch (column.type) {\n case \"date\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToDateString(date),\n )\n : DateUtils.mixedDateToDateString(databaseValue)\n break\n\n case \"time\":\n case \"time with time zone\":\n case \"time without time zone\":\n case \"timetz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(entityValue)\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToTimeString(date),\n )\n : DateUtils.mixedDateToTimeString(databaseValue)\n break\n\n case \"datetime\":\n case \"datetime2\":\n case Date:\n case \"timestamp\":\n case \"timestamp without time zone\":\n case \"timestamp with time zone\":\n case \"timestamp with local time zone\":\n case \"timestamptz\":\n normalizedValue = column.isArray\n ? entityValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n entityValue,\n )\n\n databaseValue = column.isArray\n ? databaseValue.map((date: Date) =>\n DateUtils.mixedDateToUtcDatetimeString(\n date,\n ),\n )\n : DateUtils.mixedDateToUtcDatetimeString(\n databaseValue,\n )\n\n break\n\n case \"json\":\n case \"jsonb\":\n // JSON.stringify doesn't work because postgresql sorts jsonb before save.\n // If you try to save json '[{\"messages\": \"\", \"attribute Key\": \"\", \"level\":\"\"}] ' as jsonb,\n // then postgresql will save it as '[{\"level\": \"\", \"message\":\"\", \"attributeKey\": \"\"}]'\n if (\n OrmUtils.deepCompare(entityValue, databaseValue)\n )\n return\n break\n\n case \"simple-array\":\n normalizedValue =\n DateUtils.simpleArrayToString(entityValue)\n databaseValue =\n DateUtils.simpleArrayToString(databaseValue)\n break\n case \"simple-enum\":\n normalizedValue =\n DateUtils.simpleEnumToString(entityValue)\n databaseValue =\n DateUtils.simpleEnumToString(databaseValue)\n break\n case \"simple-json\":\n normalizedValue =\n DateUtils.simpleJsonToString(entityValue)\n databaseValue =\n DateUtils.simpleJsonToString(databaseValue)\n break\n }\n\n if (column.transformer) {\n normalizedValue = ApplyValueTransformers.transformTo(\n column.transformer,\n entityValue,\n )\n }\n }\n\n // if value is not changed - then do nothing\n if (column.isArray) {\n if (OrmUtils.deepCompare(normalizedValue, databaseValue))\n return\n } else if (\n Buffer.isBuffer(normalizedValue) &&\n Buffer.isBuffer(databaseValue)\n ) {\n if (normalizedValue.equals(databaseValue)) {\n return\n }\n } else {\n if (normalizedValue === databaseValue) return\n }\n }\n\n if (!subject.diffColumns.includes(column))\n subject.diffColumns.push(column)\n\n subject.changeMaps.push({\n column: column,\n value: entityValue,\n })\n })\n }\n\n /**\n * Difference columns of the owning one-to-one and many-to-one columns.\n */\n protected computeDiffRelationalColumns(\n allSubjects: Subject[],\n subject: Subject,\n ): void {\n // if there is no persisted entity then nothing to compute changed in it\n if (!subject.entity) return\n\n subject.metadata.relationsWithJoinColumns.forEach((relation) => {\n // get the related entity from the persisted entity\n let relatedEntity = relation.getEntityValue(subject.entity!)\n\n // we don't perform operation over undefined properties (but we DO need null properties!)\n if (relatedEntity === undefined) return\n\n // if there is no database entity then all relational columns are treated as new, e.g. changed\n if (subject.databaseEntity) {\n // here we cover two scenarios:\n // 1. related entity can be another entity which is natural way\n // 2. related entity can be just an entity id\n // if relation entity is just a relation id set (for example post.tag = 1)\n // then we create an id map from it to make a proper comparision\n let relatedEntityRelationIdMap: ObjectLiteral = relatedEntity\n if (\n relatedEntityRelationIdMap !== null &&\n ObjectUtils.isObject(relatedEntityRelationIdMap)\n )\n relatedEntityRelationIdMap = relation.getRelationIdMap(\n relatedEntityRelationIdMap,\n )!\n\n // get database related entity. Since loadRelationIds are used on databaseEntity\n // related entity will contain only its relation ids\n const databaseRelatedEntityRelationIdMap =\n relation.getEntityValue(subject.databaseEntity)\n\n // if relation ids are equal then we don't need to update anything\n const areRelatedIdsEqual = OrmUtils.compareIds(\n relatedEntityRelationIdMap,\n databaseRelatedEntityRelationIdMap,\n )\n if (areRelatedIdsEqual) {\n return\n } else {\n subject.diffRelations.push(relation)\n }\n }\n\n // if there is an inserted subject for the related entity of the persisted entity then use it as related entity\n // this code is used for related entities without ids to be properly inserted (and then updated if needed)\n const valueSubject = allSubjects.find(\n (subject) =>\n subject.mustBeInserted && subject.entity === relatedEntity,\n )\n if (valueSubject) relatedEntity = valueSubject\n\n // find if there is already a relation to be changed\n const changeMap = subject.changeMaps.find(\n (changeMap) => changeMap.relation === relation,\n )\n if (changeMap) {\n // and update its value if it was found\n changeMap.value = relatedEntity\n } else {\n // if it wasn't found add a new relation for change\n subject.changeMaps.push({\n relation: relation,\n value: relatedEntity,\n })\n }\n })\n }\n}\n"],"sourceRoot":".."}
|
|
@@ -404,21 +404,15 @@ export class SubjectExecutor {
|
|
|
404
404
|
}
|
|
405
405
|
}
|
|
406
406
|
// Run nested set updates one by one
|
|
407
|
-
const
|
|
407
|
+
const updateNestSetSubjects = async () => {
|
|
408
408
|
for (const subject of nestedSetSubjects) {
|
|
409
|
-
|
|
410
|
-
await updateSubject(subject);
|
|
411
|
-
}
|
|
412
|
-
catch (error) {
|
|
413
|
-
fail(error);
|
|
414
|
-
}
|
|
409
|
+
await updateSubject(subject);
|
|
415
410
|
}
|
|
416
|
-
|
|
417
|
-
});
|
|
411
|
+
};
|
|
418
412
|
// Run all remaining subjects in parallel
|
|
419
413
|
await Promise.all([
|
|
420
414
|
...remainingSubjects.map(updateSubject),
|
|
421
|
-
|
|
415
|
+
updateNestSetSubjects(),
|
|
422
416
|
]);
|
|
423
417
|
}
|
|
424
418
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../browser/src/persistence/SubjectExecutor.ts"],"names":[],"mappings":"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","file":"SubjectExecutor.js","sourcesContent":["import { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { Subject } from \"./Subject\"\nimport { SubjectTopologicalSorter } from \"./SubjectTopologicalSorter\"\nimport { SubjectChangedColumnsComputer } from \"./SubjectChangedColumnsComputer\"\nimport { SubjectWithoutIdentifierError } from \"../error/SubjectWithoutIdentifierError\"\nimport { SubjectRemovedAndUpdatedError } from \"../error/SubjectRemovedAndUpdatedError\"\nimport { MongoEntityManager } from \"../entity-manager/MongoEntityManager\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { SaveOptions } from \"../repository/SaveOptions\"\nimport { RemoveOptions } from \"../repository/RemoveOptions\"\nimport { BroadcasterResult } from \"../subscriber/BroadcasterResult\"\nimport { NestedSetSubjectExecutor } from \"./tree/NestedSetSubjectExecutor\"\nimport { ClosureSubjectExecutor } from \"./tree/ClosureSubjectExecutor\"\nimport { MaterializedPathSubjectExecutor } from \"./tree/MaterializedPathSubjectExecutor\"\nimport { OrmUtils } from \"../util/OrmUtils\"\nimport { UpdateResult } from \"../query-builder/result/UpdateResult\"\nimport { ObjectUtils } from \"../util/ObjectUtils\"\nimport { InstanceChecker } from \"../util/InstanceChecker\"\n\n/**\n * Executes all database operations (inserts, updated, deletes) that must be executed\n * with given persistence subjects.\n */\nexport class SubjectExecutor {\n // -------------------------------------------------------------------------\n // Public Properties\n // -------------------------------------------------------------------------\n\n /**\n * Indicates if executor has any operations to execute (e.g. has insert / update / delete operations to be executed).\n */\n hasExecutableOperations: boolean = false\n\n // -------------------------------------------------------------------------\n // Protected Properties\n // -------------------------------------------------------------------------\n\n /**\n * QueryRunner used to execute all queries with a given subjects.\n */\n protected queryRunner: QueryRunner\n\n /**\n * Persistence options.\n */\n protected options?: SaveOptions & RemoveOptions\n\n /**\n * All subjects that needs to be operated.\n */\n protected allSubjects: Subject[]\n\n /**\n * Subjects that must be inserted.\n */\n protected insertSubjects: Subject[] = []\n\n /**\n * Subjects that must be updated.\n */\n protected updateSubjects: Subject[] = []\n\n /**\n * Subjects that must be removed.\n */\n protected removeSubjects: Subject[] = []\n\n /**\n * Subjects that must be soft-removed.\n */\n protected softRemoveSubjects: Subject[] = []\n\n /**\n * Subjects that must be recovered.\n */\n protected recoverSubjects: Subject[] = []\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(\n queryRunner: QueryRunner,\n subjects: Subject[],\n options?: SaveOptions & RemoveOptions,\n ) {\n this.queryRunner = queryRunner\n this.allSubjects = subjects\n this.options = options\n this.validate()\n this.recompute()\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Executes all operations over given array of subjects.\n * Executes queries using given query runner.\n */\n async execute(): Promise<void> {\n // console.time(\"SubjectExecutor.execute\");\n\n // broadcast \"before\" events before we start insert / update / remove operations\n let broadcasterResult: BroadcasterResult | undefined = undefined\n if (!this.options || this.options.listeners !== false) {\n // console.time(\".broadcastBeforeEventsForAll\");\n broadcasterResult = this.broadcastBeforeEventsForAll()\n if (broadcasterResult.promises.length > 0)\n await Promise.all(broadcasterResult.promises)\n // console.timeEnd(\".broadcastBeforeEventsForAll\");\n }\n\n // since event listeners and subscribers can call save methods and/or trigger entity changes we need to recompute operational subjects\n // recompute only in the case if any listener or subscriber was really executed\n if (broadcasterResult && broadcasterResult.count > 0) {\n // console.time(\".recompute\");\n this.insertSubjects.forEach((subject) => subject.recompute())\n this.updateSubjects.forEach((subject) => subject.recompute())\n this.removeSubjects.forEach((subject) => subject.recompute())\n this.softRemoveSubjects.forEach((subject) => subject.recompute())\n this.recoverSubjects.forEach((subject) => subject.recompute())\n this.recompute()\n // console.timeEnd(\".recompute\");\n }\n\n // make sure our insert subjects are sorted (using topological sorting) to make cascade inserts work properly\n\n // console.timeEnd(\"prepare\");\n\n // execute all insert operations\n // console.time(\".insertion\");\n this.insertSubjects = new SubjectTopologicalSorter(\n this.insertSubjects,\n ).sort(\"insert\")\n await this.executeInsertOperations()\n // console.timeEnd(\".insertion\");\n\n // recompute update operations since insertion can create updation operations for the\n // properties it wasn't able to handle on its own (referenced columns)\n this.updateSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeUpdated,\n )\n\n // execute update operations\n // console.time(\".updation\");\n await this.executeUpdateOperations()\n // console.timeEnd(\".updation\");\n\n // make sure our remove subjects are sorted (using topological sorting) when multiple entities are passed for the removal\n // console.time(\".removal\");\n this.removeSubjects = new SubjectTopologicalSorter(\n this.removeSubjects,\n ).sort(\"delete\")\n await this.executeRemoveOperations()\n // console.timeEnd(\".removal\");\n\n // recompute soft-remove operations\n this.softRemoveSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeSoftRemoved,\n )\n\n // execute soft-remove operations\n await this.executeSoftRemoveOperations()\n\n // recompute recover operations\n this.recoverSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeRecovered,\n )\n\n // execute recover operations\n await this.executeRecoverOperations()\n\n // update all special columns in persisted entities, like inserted id or remove ids from the removed entities\n // console.time(\".updateSpecialColumnsInPersistedEntities\");\n this.updateSpecialColumnsInPersistedEntities()\n // console.timeEnd(\".updateSpecialColumnsInPersistedEntities\");\n\n // finally broadcast \"after\" events after we finish insert / update / remove operations\n if (!this.options || this.options.listeners !== false) {\n // console.time(\".broadcastAfterEventsForAll\");\n broadcasterResult = this.broadcastAfterEventsForAll()\n if (broadcasterResult.promises.length > 0)\n await Promise.all(broadcasterResult.promises)\n // console.timeEnd(\".broadcastAfterEventsForAll\");\n }\n // console.timeEnd(\"SubjectExecutor.execute\");\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Validates all given subjects.\n */\n protected validate() {\n this.allSubjects.forEach((subject) => {\n if (subject.mustBeUpdated && subject.mustBeRemoved)\n throw new SubjectRemovedAndUpdatedError(subject)\n })\n }\n\n /**\n * Performs entity re-computations - finds changed columns, re-builds insert/update/remove subjects.\n */\n protected recompute(): void {\n new SubjectChangedColumnsComputer().compute(this.allSubjects)\n this.insertSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeInserted,\n )\n this.updateSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeUpdated,\n )\n this.removeSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeRemoved,\n )\n this.softRemoveSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeSoftRemoved,\n )\n this.recoverSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeRecovered,\n )\n this.hasExecutableOperations =\n this.insertSubjects.length > 0 ||\n this.updateSubjects.length > 0 ||\n this.removeSubjects.length > 0 ||\n this.softRemoveSubjects.length > 0 ||\n this.recoverSubjects.length > 0\n }\n\n /**\n * Broadcasts \"BEFORE_INSERT\", \"BEFORE_UPDATE\", \"BEFORE_REMOVE\", \"BEFORE_SOFT_REMOVE\", \"BEFORE_RECOVER\" events for all given subjects.\n */\n protected broadcastBeforeEventsForAll(): BroadcasterResult {\n const result = new BroadcasterResult()\n if (this.insertSubjects.length)\n this.insertSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastBeforeInsertEvent(\n result,\n subject.metadata,\n subject.entity!,\n ),\n )\n if (this.updateSubjects.length)\n this.updateSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastBeforeUpdateEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.diffColumns,\n subject.diffRelations,\n ),\n )\n if (this.removeSubjects.length)\n this.removeSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastBeforeRemoveEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n if (this.softRemoveSubjects.length)\n this.softRemoveSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastBeforeSoftRemoveEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n if (this.recoverSubjects.length)\n this.recoverSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastBeforeRecoverEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n return result\n }\n\n /**\n * Broadcasts \"AFTER_INSERT\", \"AFTER_UPDATE\", \"AFTER_REMOVE\", \"AFTER_SOFT_REMOVE\", \"AFTER_RECOVER\" events for all given subjects.\n * Returns void if there wasn't any listener or subscriber executed.\n * Note: this method has a performance-optimized code organization.\n */\n protected broadcastAfterEventsForAll(): BroadcasterResult {\n const result = new BroadcasterResult()\n if (this.insertSubjects.length)\n this.insertSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastAfterInsertEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.identifier,\n ),\n )\n if (this.updateSubjects.length)\n this.updateSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastAfterUpdateEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.diffColumns,\n subject.diffRelations,\n ),\n )\n if (this.removeSubjects.length)\n this.removeSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastAfterRemoveEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n if (this.softRemoveSubjects.length)\n this.softRemoveSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastAfterSoftRemoveEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n if (this.recoverSubjects.length)\n this.recoverSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastAfterRecoverEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n return result\n }\n\n /**\n * Executes insert operations.\n */\n protected async executeInsertOperations(): Promise<void> {\n // group insertion subjects to make bulk insertions\n const [groupedInsertSubjects, groupedInsertSubjectKeys] =\n this.groupBulkSubjects(this.insertSubjects, \"insert\")\n\n // then we run insertion in the sequential order which is important since we have an ordered subjects\n for (const groupName of groupedInsertSubjectKeys) {\n const subjects = groupedInsertSubjects[groupName]\n\n // we must separately insert entities which does not have any values to insert\n // because its not possible to insert multiple entities with only default values in bulk\n const bulkInsertMaps: ObjectLiteral[] = []\n const bulkInsertSubjects: Subject[] = []\n const singleInsertSubjects: Subject[] = []\n if (this.queryRunner.connection.driver.options.type === \"mongodb\") {\n subjects.forEach((subject) => {\n if (subject.metadata.createDateColumn && subject.entity) {\n subject.entity[\n subject.metadata.createDateColumn.databaseName\n ] = new Date()\n }\n\n if (subject.metadata.updateDateColumn && subject.entity) {\n subject.entity[\n subject.metadata.updateDateColumn.databaseName\n ] = new Date()\n }\n\n subject.createValueSetAndPopChangeMap()\n\n bulkInsertSubjects.push(subject)\n bulkInsertMaps.push(subject.entity!)\n })\n } else if (\n this.queryRunner.connection.driver.options.type === \"oracle\"\n ) {\n subjects.forEach((subject) => {\n singleInsertSubjects.push(subject)\n })\n } else {\n subjects.forEach((subject) => {\n // we do not insert in bulk in following cases:\n // - when there is no values in insert (only defaults are inserted), since we cannot use DEFAULT VALUES expression for multiple inserted rows\n // - when entity is a tree table, since tree tables require extra operation per each inserted row\n // - when oracle is used, since oracle's bulk insertion is very bad\n if (\n subject.changeMaps.length === 0 ||\n subject.metadata.treeType ||\n this.queryRunner.connection.driver.options.type ===\n \"oracle\" ||\n this.queryRunner.connection.driver.options.type ===\n \"sap\"\n ) {\n singleInsertSubjects.push(subject)\n } else {\n bulkInsertSubjects.push(subject)\n bulkInsertMaps.push(\n subject.createValueSetAndPopChangeMap(),\n )\n }\n })\n }\n\n // for mongodb we have a bit different insertion logic\n if (\n InstanceChecker.isMongoEntityManager(this.queryRunner.manager)\n ) {\n const insertResult = await this.queryRunner.manager.insert(\n subjects[0].metadata.target,\n bulkInsertMaps,\n )\n subjects.forEach((subject, index) => {\n subject.identifier = insertResult.identifiers[index]\n subject.generatedMap = insertResult.generatedMaps[index]\n subject.insertedValueSet = bulkInsertMaps[index]\n })\n } else {\n // here we execute our insertion query\n // we need to enable entity updation because we DO need to have updated insertedMap\n // which is not same object as our entity that's why we don't need to worry about our entity to get dirty\n // also, we disable listeners because we call them on our own in persistence layer\n if (bulkInsertMaps.length > 0) {\n const insertResult = await this.queryRunner.manager\n .createQueryBuilder()\n .insert()\n .into(subjects[0].metadata.target)\n .values(bulkInsertMaps)\n .updateEntity(\n this.options && this.options.reload === false\n ? false\n : true,\n )\n .callListeners(false)\n .execute()\n\n bulkInsertSubjects.forEach((subject, index) => {\n subject.identifier = insertResult.identifiers[index]\n subject.generatedMap = insertResult.generatedMaps[index]\n subject.insertedValueSet = bulkInsertMaps[index]\n })\n }\n\n // insert subjects which must be inserted in separate requests (all default values)\n if (singleInsertSubjects.length > 0) {\n for (const subject of singleInsertSubjects) {\n subject.insertedValueSet =\n subject.createValueSetAndPopChangeMap() // important to have because query builder sets inserted values into it\n\n // for nested set we execute additional queries\n if (subject.metadata.treeType === \"nested-set\")\n await new NestedSetSubjectExecutor(\n this.queryRunner,\n ).insert(subject)\n\n await this.queryRunner.manager\n .createQueryBuilder()\n .insert()\n .into(subject.metadata.target)\n .values(subject.insertedValueSet)\n .updateEntity(\n this.options && this.options.reload === false\n ? false\n : true,\n )\n .callListeners(false)\n .execute()\n .then((insertResult) => {\n subject.identifier = insertResult.identifiers[0]\n subject.generatedMap =\n insertResult.generatedMaps[0]\n })\n\n // for tree tables we execute additional queries\n if (subject.metadata.treeType === \"closure-table\") {\n await new ClosureSubjectExecutor(\n this.queryRunner,\n ).insert(subject)\n } else if (\n subject.metadata.treeType === \"materialized-path\"\n ) {\n await new MaterializedPathSubjectExecutor(\n this.queryRunner,\n ).insert(subject)\n }\n }\n }\n }\n\n subjects.forEach((subject) => {\n if (subject.generatedMap) {\n subject.metadata.columns.forEach((column) => {\n const value = column.getEntityValue(\n subject.generatedMap!,\n )\n if (value !== undefined && value !== null) {\n const preparedValue =\n this.queryRunner.connection.driver.prepareHydratedValue(\n value,\n column,\n )\n column.setEntityValue(\n subject.generatedMap!,\n preparedValue,\n )\n }\n })\n }\n })\n }\n }\n\n /**\n * Updates all given subjects in the database.\n */\n protected async executeUpdateOperations(): Promise<void> {\n const updateSubject = async (subject: Subject) => {\n if (!subject.identifier)\n throw new SubjectWithoutIdentifierError(subject)\n\n // for mongodb we have a bit different updation logic\n if (\n InstanceChecker.isMongoEntityManager(this.queryRunner.manager)\n ) {\n const partialEntity = this.cloneMongoSubjectEntity(subject)\n if (\n subject.metadata.objectIdColumn &&\n subject.metadata.objectIdColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.objectIdColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.createDateColumn &&\n subject.metadata.createDateColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.createDateColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.updateDateColumn &&\n subject.metadata.updateDateColumn.propertyName\n ) {\n partialEntity[\n subject.metadata.updateDateColumn.propertyName\n ] = new Date()\n }\n\n const manager = this.queryRunner.manager as MongoEntityManager\n\n await manager.update(\n subject.metadata.target,\n subject.identifier,\n partialEntity,\n )\n } else {\n const updateMap: ObjectLiteral =\n subject.createValueSetAndPopChangeMap()\n\n // for tree tables we execute additional queries\n switch (subject.metadata.treeType) {\n case \"nested-set\":\n await new NestedSetSubjectExecutor(\n this.queryRunner,\n ).update(subject)\n break\n\n case \"closure-table\":\n await new ClosureSubjectExecutor(\n this.queryRunner,\n ).update(subject)\n break\n\n case \"materialized-path\":\n await new MaterializedPathSubjectExecutor(\n this.queryRunner,\n ).update(subject)\n break\n }\n\n // here we execute our updation query\n // we need to enable entity updation because we update a subject identifier\n // which is not same object as our entity that's why we don't need to worry about our entity to get dirty\n // also, we disable listeners because we call them on our own in persistence layer\n const updateQueryBuilder = this.queryRunner.manager\n .createQueryBuilder()\n .update(subject.metadata.target)\n .set(updateMap)\n .updateEntity(\n this.options && this.options.reload === false\n ? false\n : true,\n )\n .callListeners(false)\n\n if (subject.entity) {\n updateQueryBuilder.whereEntity(subject.identifier)\n } else {\n // in this case identifier is just conditions object to update by\n updateQueryBuilder.where(subject.identifier)\n }\n\n const updateResult = await updateQueryBuilder.execute()\n const updateGeneratedMap = updateResult.generatedMaps[0]\n if (updateGeneratedMap) {\n subject.metadata.columns.forEach((column) => {\n const value = column.getEntityValue(updateGeneratedMap!)\n if (value !== undefined && value !== null) {\n const preparedValue =\n this.queryRunner.connection.driver.prepareHydratedValue(\n value,\n column,\n )\n column.setEntityValue(\n updateGeneratedMap!,\n preparedValue,\n )\n }\n })\n if (!subject.generatedMap) {\n subject.generatedMap = {}\n }\n Object.assign(subject.generatedMap, updateGeneratedMap)\n }\n }\n }\n\n // Nested sets need to be updated one by one\n // Split array in two, one with nested set subjects and the other with the remaining subjects\n const nestedSetSubjects: Subject[] = []\n const remainingSubjects: Subject[] = []\n\n for (const subject of this.updateSubjects) {\n if (subject.metadata.treeType === \"nested-set\") {\n nestedSetSubjects.push(subject)\n } else {\n remainingSubjects.push(subject)\n }\n }\n\n // Run nested set updates one by one\n const nestedSetPromise = new Promise<void>(async (ok, fail) => {\n for (const subject of nestedSetSubjects) {\n try {\n await updateSubject(subject)\n } catch (error) {\n fail(error)\n }\n }\n ok()\n })\n\n // Run all remaining subjects in parallel\n await Promise.all([\n ...remainingSubjects.map(updateSubject),\n nestedSetPromise,\n ])\n }\n\n /**\n * Removes all given subjects from the database.\n *\n * todo: we need to apply topological sort here as well\n */\n protected async executeRemoveOperations(): Promise<void> {\n // group insertion subjects to make bulk insertions\n const [groupedRemoveSubjects, groupedRemoveSubjectKeys] =\n this.groupBulkSubjects(this.removeSubjects, \"delete\")\n\n for (const groupName of groupedRemoveSubjectKeys) {\n const subjects = groupedRemoveSubjects[groupName]\n const deleteMaps = subjects.map((subject) => {\n if (!subject.identifier)\n throw new SubjectWithoutIdentifierError(subject)\n\n return subject.identifier\n })\n\n // for mongodb we have a bit different updation logic\n if (\n InstanceChecker.isMongoEntityManager(this.queryRunner.manager)\n ) {\n const manager = this.queryRunner.manager as MongoEntityManager\n await manager.delete(subjects[0].metadata.target, deleteMaps)\n } else {\n // for tree tables we execute additional queries\n switch (subjects[0].metadata.treeType) {\n case \"nested-set\":\n await new NestedSetSubjectExecutor(\n this.queryRunner,\n ).remove(subjects)\n break\n\n case \"closure-table\":\n await new ClosureSubjectExecutor(\n this.queryRunner,\n ).remove(subjects)\n break\n }\n\n // here we execute our deletion query\n // we don't need to specify entities and set update entity to true since the only thing query builder\n // will do for use is a primary keys deletion which is handled by us later once persistence is finished\n // also, we disable listeners because we call them on our own in persistence layer\n await this.queryRunner.manager\n .createQueryBuilder()\n .delete()\n .from(subjects[0].metadata.target)\n .where(deleteMaps)\n .callListeners(false)\n .execute()\n }\n }\n }\n\n private cloneMongoSubjectEntity(subject: Subject): ObjectLiteral {\n const target: ObjectLiteral = {}\n\n if (subject.entity) {\n for (const column of subject.metadata.columns) {\n OrmUtils.mergeDeep(\n target,\n column.getEntityValueMap(subject.entity),\n )\n }\n }\n\n return target\n }\n\n /**\n * Soft-removes all given subjects in the database.\n */\n protected async executeSoftRemoveOperations(): Promise<void> {\n await Promise.all(\n this.softRemoveSubjects.map(async (subject) => {\n if (!subject.identifier)\n throw new SubjectWithoutIdentifierError(subject)\n\n let updateResult: UpdateResult\n\n // for mongodb we have a bit different updation logic\n if (\n InstanceChecker.isMongoEntityManager(\n this.queryRunner.manager,\n )\n ) {\n const partialEntity = this.cloneMongoSubjectEntity(subject)\n if (\n subject.metadata.objectIdColumn &&\n subject.metadata.objectIdColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.objectIdColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.createDateColumn &&\n subject.metadata.createDateColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.createDateColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.updateDateColumn &&\n subject.metadata.updateDateColumn.propertyName\n ) {\n partialEntity[\n subject.metadata.updateDateColumn.propertyName\n ] = new Date()\n }\n\n if (\n subject.metadata.deleteDateColumn &&\n subject.metadata.deleteDateColumn.propertyName\n ) {\n partialEntity[\n subject.metadata.deleteDateColumn.propertyName\n ] = new Date()\n }\n\n const manager = this.queryRunner\n .manager as MongoEntityManager\n\n updateResult = await manager.update(\n subject.metadata.target,\n subject.identifier,\n partialEntity,\n )\n } else {\n // here we execute our soft-deletion query\n // we need to enable entity soft-deletion because we update a subject identifier\n // which is not same object as our entity that's why we don't need to worry about our entity to get dirty\n // also, we disable listeners because we call them on our own in persistence layer\n const softDeleteQueryBuilder = this.queryRunner.manager\n .createQueryBuilder()\n .softDelete()\n .from(subject.metadata.target)\n .updateEntity(\n this.options && this.options.reload === false\n ? false\n : true,\n )\n .callListeners(false)\n\n if (subject.entity) {\n softDeleteQueryBuilder.whereEntity(subject.identifier)\n } else {\n // in this case identifier is just conditions object to update by\n softDeleteQueryBuilder.where(subject.identifier)\n }\n\n updateResult = await softDeleteQueryBuilder.execute()\n }\n\n subject.generatedMap = updateResult.generatedMaps[0]\n if (subject.generatedMap) {\n subject.metadata.columns.forEach((column) => {\n const value = column.getEntityValue(\n subject.generatedMap!,\n )\n if (value !== undefined && value !== null) {\n const preparedValue =\n this.queryRunner.connection.driver.prepareHydratedValue(\n value,\n column,\n )\n column.setEntityValue(\n subject.generatedMap!,\n preparedValue,\n )\n }\n })\n }\n\n // experiments, remove probably, need to implement tree tables children removal\n // if (subject.updatedRelationMaps.length > 0) {\n // await Promise.all(subject.updatedRelationMaps.map(async updatedRelation => {\n // if (!updatedRelation.relation.isTreeParent) return;\n // if (!updatedRelation.value !== null) return;\n //\n // if (subject.metadata.treeType === \"closure-table\") {\n // await new ClosureSubjectExecutor(this.queryRunner).deleteChildrenOf(subject);\n // }\n // }));\n // }\n }),\n )\n }\n\n /**\n * Recovers all given subjects in the database.\n */\n protected async executeRecoverOperations(): Promise<void> {\n await Promise.all(\n this.recoverSubjects.map(async (subject) => {\n if (!subject.identifier)\n throw new SubjectWithoutIdentifierError(subject)\n\n let updateResult: UpdateResult\n\n // for mongodb we have a bit different updation logic\n if (\n InstanceChecker.isMongoEntityManager(\n this.queryRunner.manager,\n )\n ) {\n const partialEntity = this.cloneMongoSubjectEntity(subject)\n if (\n subject.metadata.objectIdColumn &&\n subject.metadata.objectIdColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.objectIdColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.createDateColumn &&\n subject.metadata.createDateColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.createDateColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.updateDateColumn &&\n subject.metadata.updateDateColumn.propertyName\n ) {\n partialEntity[\n subject.metadata.updateDateColumn.propertyName\n ] = new Date()\n }\n\n if (\n subject.metadata.deleteDateColumn &&\n subject.metadata.deleteDateColumn.propertyName\n ) {\n partialEntity[\n subject.metadata.deleteDateColumn.propertyName\n ] = null\n }\n\n const manager = this.queryRunner\n .manager as MongoEntityManager\n\n updateResult = await manager.update(\n subject.metadata.target,\n subject.identifier,\n partialEntity,\n )\n } else {\n // here we execute our restory query\n // we need to enable entity restory because we update a subject identifier\n // which is not same object as our entity that's why we don't need to worry about our entity to get dirty\n // also, we disable listeners because we call them on our own in persistence layer\n const softDeleteQueryBuilder = this.queryRunner.manager\n .createQueryBuilder()\n .restore()\n .from(subject.metadata.target)\n .updateEntity(\n this.options && this.options.reload === false\n ? false\n : true,\n )\n .callListeners(false)\n\n if (subject.entity) {\n softDeleteQueryBuilder.whereEntity(subject.identifier)\n } else {\n // in this case identifier is just conditions object to update by\n softDeleteQueryBuilder.where(subject.identifier)\n }\n\n updateResult = await softDeleteQueryBuilder.execute()\n }\n\n subject.generatedMap = updateResult.generatedMaps[0]\n if (subject.generatedMap) {\n subject.metadata.columns.forEach((column) => {\n const value = column.getEntityValue(\n subject.generatedMap!,\n )\n if (value !== undefined && value !== null) {\n const preparedValue =\n this.queryRunner.connection.driver.prepareHydratedValue(\n value,\n column,\n )\n column.setEntityValue(\n subject.generatedMap!,\n preparedValue,\n )\n }\n })\n }\n\n // experiments, remove probably, need to implement tree tables children removal\n // if (subject.updatedRelationMaps.length > 0) {\n // await Promise.all(subject.updatedRelationMaps.map(async updatedRelation => {\n // if (!updatedRelation.relation.isTreeParent) return;\n // if (!updatedRelation.value !== null) return;\n //\n // if (subject.metadata.treeType === \"closure-table\") {\n // await new ClosureSubjectExecutor(this.queryRunner).deleteChildrenOf(subject);\n // }\n // }));\n // }\n }),\n )\n }\n\n /**\n * Updates all special columns of the saving entities (create date, update date, version, etc.).\n * Also updates nullable columns and columns with default values.\n */\n protected updateSpecialColumnsInPersistedEntities(): void {\n // update inserted entity properties\n if (this.insertSubjects.length)\n this.updateSpecialColumnsInInsertedAndUpdatedEntities(\n this.insertSubjects,\n )\n\n // update updated entity properties\n if (this.updateSubjects.length)\n this.updateSpecialColumnsInInsertedAndUpdatedEntities(\n this.updateSubjects,\n )\n\n // update soft-removed entity properties\n if (this.softRemoveSubjects.length)\n this.updateSpecialColumnsInInsertedAndUpdatedEntities(\n this.softRemoveSubjects,\n )\n\n // update recovered entity properties\n if (this.recoverSubjects.length)\n this.updateSpecialColumnsInInsertedAndUpdatedEntities(\n this.recoverSubjects,\n )\n\n // remove ids from the entities that were removed\n if (this.removeSubjects.length) {\n this.removeSubjects.forEach((subject) => {\n if (!subject.entity) return\n\n subject.metadata.primaryColumns.forEach((primaryColumn) => {\n primaryColumn.setEntityValue(subject.entity!, undefined)\n })\n })\n }\n\n // other post-persist updations\n this.allSubjects.forEach((subject) => {\n if (!subject.entity) return\n\n subject.metadata.relationIds.forEach((relationId) => {\n relationId.setValue(subject.entity!)\n })\n\n // mongo _id remove\n if (\n InstanceChecker.isMongoEntityManager(this.queryRunner.manager)\n ) {\n if (\n subject.metadata.objectIdColumn &&\n subject.metadata.objectIdColumn.databaseName &&\n subject.metadata.objectIdColumn.databaseName !==\n subject.metadata.objectIdColumn.propertyName\n ) {\n delete subject.entity[\n subject.metadata.objectIdColumn.databaseName\n ]\n }\n }\n })\n }\n\n /**\n * Updates all special columns of the saving entities (create date, update date, version, etc.).\n * Also updates nullable columns and columns with default values.\n */\n protected updateSpecialColumnsInInsertedAndUpdatedEntities(\n subjects: Subject[],\n ): void {\n subjects.forEach((subject) => {\n if (!subject.entity) return\n\n // set values to \"null\" for nullable columns that did not have values\n subject.metadata.columns.forEach((column) => {\n // if table inheritance is used make sure this column is not child's column\n if (\n subject.metadata.childEntityMetadatas.length > 0 &&\n subject.metadata.childEntityMetadatas\n .map((metadata) => metadata.target)\n .indexOf(column.target) !== -1\n )\n return\n\n // entities does not have virtual columns\n if (column.isVirtual) return\n\n // if column is deletedAt\n if (column.isDeleteDate) return\n\n // update nullable columns\n if (column.isNullable) {\n const columnValue = column.getEntityValue(subject.entity!)\n if (columnValue === undefined)\n column.setEntityValue(subject.entity!, null)\n }\n\n // update relational columns\n if (subject.updatedRelationMaps.length > 0) {\n subject.updatedRelationMaps.forEach(\n (updatedRelationMap) => {\n updatedRelationMap.relation.joinColumns.forEach(\n (column) => {\n if (column.isVirtual === true) return\n\n column.setEntityValue(\n subject.entity!,\n ObjectUtils.isObject(\n updatedRelationMap.value,\n )\n ? column.referencedColumn!.getEntityValue(\n updatedRelationMap.value,\n )\n : updatedRelationMap.value,\n )\n },\n )\n },\n )\n }\n })\n\n // merge into entity all generated values returned by a database\n if (subject.generatedMap)\n this.queryRunner.manager.merge(\n subject.metadata.target as any,\n subject.entity,\n subject.generatedMap,\n )\n })\n }\n\n /**\n * Groups subjects by metadata names (by tables) to make bulk insertions and deletions possible.\n * However there are some limitations with bulk insertions of data into tables with generated (increment) columns\n * in some drivers. Some drivers like mysql and sqlite does not support returning multiple generated columns\n * after insertion and can only return a single generated column value, that's why its not possible to do bulk insertion,\n * because it breaks insertion result's generatedMap and leads to problems when this subject is used in other subjects saves.\n * That's why we only support bulking in junction tables for those drivers.\n *\n * Other drivers like postgres and sql server support RETURNING / OUTPUT statement which allows to return generated\n * id for each inserted row, that's why bulk insertion is not limited to junction tables in there.\n */\n protected groupBulkSubjects(\n subjects: Subject[],\n type: \"insert\" | \"delete\",\n ): [{ [key: string]: Subject[] }, string[]] {\n const group: { [key: string]: Subject[] } = {}\n const keys: string[] = []\n const hasReturningDependColumns = subjects.some((subject) => {\n return subject.metadata.getInsertionReturningColumns().length > 0\n })\n const groupingAllowed =\n type === \"delete\" ||\n this.queryRunner.connection.driver.isReturningSqlSupported(\n \"insert\",\n ) ||\n hasReturningDependColumns === false\n\n subjects.forEach((subject, index) => {\n const key =\n groupingAllowed || subject.metadata.isJunction\n ? subject.metadata.name\n : subject.metadata.name + \"_\" + index\n if (!group[key]) {\n group[key] = [subject]\n keys.push(key)\n } else {\n group[key].push(subject)\n }\n })\n\n return [group, keys]\n }\n}\n"],"sourceRoot":".."}
|
|
1
|
+
{"version":3,"sources":["../browser/src/persistence/SubjectExecutor.ts"],"names":[],"mappings":"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","file":"SubjectExecutor.js","sourcesContent":["import { QueryRunner } from \"../query-runner/QueryRunner\"\nimport { Subject } from \"./Subject\"\nimport { SubjectTopologicalSorter } from \"./SubjectTopologicalSorter\"\nimport { SubjectChangedColumnsComputer } from \"./SubjectChangedColumnsComputer\"\nimport { SubjectWithoutIdentifierError } from \"../error/SubjectWithoutIdentifierError\"\nimport { SubjectRemovedAndUpdatedError } from \"../error/SubjectRemovedAndUpdatedError\"\nimport { MongoEntityManager } from \"../entity-manager/MongoEntityManager\"\nimport { ObjectLiteral } from \"../common/ObjectLiteral\"\nimport { SaveOptions } from \"../repository/SaveOptions\"\nimport { RemoveOptions } from \"../repository/RemoveOptions\"\nimport { BroadcasterResult } from \"../subscriber/BroadcasterResult\"\nimport { NestedSetSubjectExecutor } from \"./tree/NestedSetSubjectExecutor\"\nimport { ClosureSubjectExecutor } from \"./tree/ClosureSubjectExecutor\"\nimport { MaterializedPathSubjectExecutor } from \"./tree/MaterializedPathSubjectExecutor\"\nimport { OrmUtils } from \"../util/OrmUtils\"\nimport { UpdateResult } from \"../query-builder/result/UpdateResult\"\nimport { ObjectUtils } from \"../util/ObjectUtils\"\nimport { InstanceChecker } from \"../util/InstanceChecker\"\n\n/**\n * Executes all database operations (inserts, updated, deletes) that must be executed\n * with given persistence subjects.\n */\nexport class SubjectExecutor {\n // -------------------------------------------------------------------------\n // Public Properties\n // -------------------------------------------------------------------------\n\n /**\n * Indicates if executor has any operations to execute (e.g. has insert / update / delete operations to be executed).\n */\n hasExecutableOperations: boolean = false\n\n // -------------------------------------------------------------------------\n // Protected Properties\n // -------------------------------------------------------------------------\n\n /**\n * QueryRunner used to execute all queries with a given subjects.\n */\n protected queryRunner: QueryRunner\n\n /**\n * Persistence options.\n */\n protected options?: SaveOptions & RemoveOptions\n\n /**\n * All subjects that needs to be operated.\n */\n protected allSubjects: Subject[]\n\n /**\n * Subjects that must be inserted.\n */\n protected insertSubjects: Subject[] = []\n\n /**\n * Subjects that must be updated.\n */\n protected updateSubjects: Subject[] = []\n\n /**\n * Subjects that must be removed.\n */\n protected removeSubjects: Subject[] = []\n\n /**\n * Subjects that must be soft-removed.\n */\n protected softRemoveSubjects: Subject[] = []\n\n /**\n * Subjects that must be recovered.\n */\n protected recoverSubjects: Subject[] = []\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(\n queryRunner: QueryRunner,\n subjects: Subject[],\n options?: SaveOptions & RemoveOptions,\n ) {\n this.queryRunner = queryRunner\n this.allSubjects = subjects\n this.options = options\n this.validate()\n this.recompute()\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n /**\n * Executes all operations over given array of subjects.\n * Executes queries using given query runner.\n */\n async execute(): Promise<void> {\n // console.time(\"SubjectExecutor.execute\");\n\n // broadcast \"before\" events before we start insert / update / remove operations\n let broadcasterResult: BroadcasterResult | undefined = undefined\n if (!this.options || this.options.listeners !== false) {\n // console.time(\".broadcastBeforeEventsForAll\");\n broadcasterResult = this.broadcastBeforeEventsForAll()\n if (broadcasterResult.promises.length > 0)\n await Promise.all(broadcasterResult.promises)\n // console.timeEnd(\".broadcastBeforeEventsForAll\");\n }\n\n // since event listeners and subscribers can call save methods and/or trigger entity changes we need to recompute operational subjects\n // recompute only in the case if any listener or subscriber was really executed\n if (broadcasterResult && broadcasterResult.count > 0) {\n // console.time(\".recompute\");\n this.insertSubjects.forEach((subject) => subject.recompute())\n this.updateSubjects.forEach((subject) => subject.recompute())\n this.removeSubjects.forEach((subject) => subject.recompute())\n this.softRemoveSubjects.forEach((subject) => subject.recompute())\n this.recoverSubjects.forEach((subject) => subject.recompute())\n this.recompute()\n // console.timeEnd(\".recompute\");\n }\n\n // make sure our insert subjects are sorted (using topological sorting) to make cascade inserts work properly\n\n // console.timeEnd(\"prepare\");\n\n // execute all insert operations\n // console.time(\".insertion\");\n this.insertSubjects = new SubjectTopologicalSorter(\n this.insertSubjects,\n ).sort(\"insert\")\n await this.executeInsertOperations()\n // console.timeEnd(\".insertion\");\n\n // recompute update operations since insertion can create updation operations for the\n // properties it wasn't able to handle on its own (referenced columns)\n this.updateSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeUpdated,\n )\n\n // execute update operations\n // console.time(\".updation\");\n await this.executeUpdateOperations()\n // console.timeEnd(\".updation\");\n\n // make sure our remove subjects are sorted (using topological sorting) when multiple entities are passed for the removal\n // console.time(\".removal\");\n this.removeSubjects = new SubjectTopologicalSorter(\n this.removeSubjects,\n ).sort(\"delete\")\n await this.executeRemoveOperations()\n // console.timeEnd(\".removal\");\n\n // recompute soft-remove operations\n this.softRemoveSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeSoftRemoved,\n )\n\n // execute soft-remove operations\n await this.executeSoftRemoveOperations()\n\n // recompute recover operations\n this.recoverSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeRecovered,\n )\n\n // execute recover operations\n await this.executeRecoverOperations()\n\n // update all special columns in persisted entities, like inserted id or remove ids from the removed entities\n // console.time(\".updateSpecialColumnsInPersistedEntities\");\n this.updateSpecialColumnsInPersistedEntities()\n // console.timeEnd(\".updateSpecialColumnsInPersistedEntities\");\n\n // finally broadcast \"after\" events after we finish insert / update / remove operations\n if (!this.options || this.options.listeners !== false) {\n // console.time(\".broadcastAfterEventsForAll\");\n broadcasterResult = this.broadcastAfterEventsForAll()\n if (broadcasterResult.promises.length > 0)\n await Promise.all(broadcasterResult.promises)\n // console.timeEnd(\".broadcastAfterEventsForAll\");\n }\n // console.timeEnd(\"SubjectExecutor.execute\");\n }\n\n // -------------------------------------------------------------------------\n // Protected Methods\n // -------------------------------------------------------------------------\n\n /**\n * Validates all given subjects.\n */\n protected validate() {\n this.allSubjects.forEach((subject) => {\n if (subject.mustBeUpdated && subject.mustBeRemoved)\n throw new SubjectRemovedAndUpdatedError(subject)\n })\n }\n\n /**\n * Performs entity re-computations - finds changed columns, re-builds insert/update/remove subjects.\n */\n protected recompute(): void {\n new SubjectChangedColumnsComputer().compute(this.allSubjects)\n this.insertSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeInserted,\n )\n this.updateSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeUpdated,\n )\n this.removeSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeRemoved,\n )\n this.softRemoveSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeSoftRemoved,\n )\n this.recoverSubjects = this.allSubjects.filter(\n (subject) => subject.mustBeRecovered,\n )\n this.hasExecutableOperations =\n this.insertSubjects.length > 0 ||\n this.updateSubjects.length > 0 ||\n this.removeSubjects.length > 0 ||\n this.softRemoveSubjects.length > 0 ||\n this.recoverSubjects.length > 0\n }\n\n /**\n * Broadcasts \"BEFORE_INSERT\", \"BEFORE_UPDATE\", \"BEFORE_REMOVE\", \"BEFORE_SOFT_REMOVE\", \"BEFORE_RECOVER\" events for all given subjects.\n */\n protected broadcastBeforeEventsForAll(): BroadcasterResult {\n const result = new BroadcasterResult()\n if (this.insertSubjects.length)\n this.insertSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastBeforeInsertEvent(\n result,\n subject.metadata,\n subject.entity!,\n ),\n )\n if (this.updateSubjects.length)\n this.updateSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastBeforeUpdateEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.diffColumns,\n subject.diffRelations,\n ),\n )\n if (this.removeSubjects.length)\n this.removeSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastBeforeRemoveEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n if (this.softRemoveSubjects.length)\n this.softRemoveSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastBeforeSoftRemoveEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n if (this.recoverSubjects.length)\n this.recoverSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastBeforeRecoverEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n return result\n }\n\n /**\n * Broadcasts \"AFTER_INSERT\", \"AFTER_UPDATE\", \"AFTER_REMOVE\", \"AFTER_SOFT_REMOVE\", \"AFTER_RECOVER\" events for all given subjects.\n * Returns void if there wasn't any listener or subscriber executed.\n * Note: this method has a performance-optimized code organization.\n */\n protected broadcastAfterEventsForAll(): BroadcasterResult {\n const result = new BroadcasterResult()\n if (this.insertSubjects.length)\n this.insertSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastAfterInsertEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.identifier,\n ),\n )\n if (this.updateSubjects.length)\n this.updateSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastAfterUpdateEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.diffColumns,\n subject.diffRelations,\n ),\n )\n if (this.removeSubjects.length)\n this.removeSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastAfterRemoveEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n if (this.softRemoveSubjects.length)\n this.softRemoveSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastAfterSoftRemoveEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n if (this.recoverSubjects.length)\n this.recoverSubjects.forEach((subject) =>\n this.queryRunner.broadcaster.broadcastAfterRecoverEvent(\n result,\n subject.metadata,\n subject.entity!,\n subject.databaseEntity,\n subject.identifier,\n ),\n )\n return result\n }\n\n /**\n * Executes insert operations.\n */\n protected async executeInsertOperations(): Promise<void> {\n // group insertion subjects to make bulk insertions\n const [groupedInsertSubjects, groupedInsertSubjectKeys] =\n this.groupBulkSubjects(this.insertSubjects, \"insert\")\n\n // then we run insertion in the sequential order which is important since we have an ordered subjects\n for (const groupName of groupedInsertSubjectKeys) {\n const subjects = groupedInsertSubjects[groupName]\n\n // we must separately insert entities which does not have any values to insert\n // because its not possible to insert multiple entities with only default values in bulk\n const bulkInsertMaps: ObjectLiteral[] = []\n const bulkInsertSubjects: Subject[] = []\n const singleInsertSubjects: Subject[] = []\n if (this.queryRunner.connection.driver.options.type === \"mongodb\") {\n subjects.forEach((subject) => {\n if (subject.metadata.createDateColumn && subject.entity) {\n subject.entity[\n subject.metadata.createDateColumn.databaseName\n ] = new Date()\n }\n\n if (subject.metadata.updateDateColumn && subject.entity) {\n subject.entity[\n subject.metadata.updateDateColumn.databaseName\n ] = new Date()\n }\n\n subject.createValueSetAndPopChangeMap()\n\n bulkInsertSubjects.push(subject)\n bulkInsertMaps.push(subject.entity!)\n })\n } else if (\n this.queryRunner.connection.driver.options.type === \"oracle\"\n ) {\n subjects.forEach((subject) => {\n singleInsertSubjects.push(subject)\n })\n } else {\n subjects.forEach((subject) => {\n // we do not insert in bulk in following cases:\n // - when there is no values in insert (only defaults are inserted), since we cannot use DEFAULT VALUES expression for multiple inserted rows\n // - when entity is a tree table, since tree tables require extra operation per each inserted row\n // - when oracle is used, since oracle's bulk insertion is very bad\n if (\n subject.changeMaps.length === 0 ||\n subject.metadata.treeType ||\n this.queryRunner.connection.driver.options.type ===\n \"oracle\" ||\n this.queryRunner.connection.driver.options.type ===\n \"sap\"\n ) {\n singleInsertSubjects.push(subject)\n } else {\n bulkInsertSubjects.push(subject)\n bulkInsertMaps.push(\n subject.createValueSetAndPopChangeMap(),\n )\n }\n })\n }\n\n // for mongodb we have a bit different insertion logic\n if (\n InstanceChecker.isMongoEntityManager(this.queryRunner.manager)\n ) {\n const insertResult = await this.queryRunner.manager.insert(\n subjects[0].metadata.target,\n bulkInsertMaps,\n )\n subjects.forEach((subject, index) => {\n subject.identifier = insertResult.identifiers[index]\n subject.generatedMap = insertResult.generatedMaps[index]\n subject.insertedValueSet = bulkInsertMaps[index]\n })\n } else {\n // here we execute our insertion query\n // we need to enable entity updation because we DO need to have updated insertedMap\n // which is not same object as our entity that's why we don't need to worry about our entity to get dirty\n // also, we disable listeners because we call them on our own in persistence layer\n if (bulkInsertMaps.length > 0) {\n const insertResult = await this.queryRunner.manager\n .createQueryBuilder()\n .insert()\n .into(subjects[0].metadata.target)\n .values(bulkInsertMaps)\n .updateEntity(\n this.options && this.options.reload === false\n ? false\n : true,\n )\n .callListeners(false)\n .execute()\n\n bulkInsertSubjects.forEach((subject, index) => {\n subject.identifier = insertResult.identifiers[index]\n subject.generatedMap = insertResult.generatedMaps[index]\n subject.insertedValueSet = bulkInsertMaps[index]\n })\n }\n\n // insert subjects which must be inserted in separate requests (all default values)\n if (singleInsertSubjects.length > 0) {\n for (const subject of singleInsertSubjects) {\n subject.insertedValueSet =\n subject.createValueSetAndPopChangeMap() // important to have because query builder sets inserted values into it\n\n // for nested set we execute additional queries\n if (subject.metadata.treeType === \"nested-set\")\n await new NestedSetSubjectExecutor(\n this.queryRunner,\n ).insert(subject)\n\n await this.queryRunner.manager\n .createQueryBuilder()\n .insert()\n .into(subject.metadata.target)\n .values(subject.insertedValueSet)\n .updateEntity(\n this.options && this.options.reload === false\n ? false\n : true,\n )\n .callListeners(false)\n .execute()\n .then((insertResult) => {\n subject.identifier = insertResult.identifiers[0]\n subject.generatedMap =\n insertResult.generatedMaps[0]\n })\n\n // for tree tables we execute additional queries\n if (subject.metadata.treeType === \"closure-table\") {\n await new ClosureSubjectExecutor(\n this.queryRunner,\n ).insert(subject)\n } else if (\n subject.metadata.treeType === \"materialized-path\"\n ) {\n await new MaterializedPathSubjectExecutor(\n this.queryRunner,\n ).insert(subject)\n }\n }\n }\n }\n\n subjects.forEach((subject) => {\n if (subject.generatedMap) {\n subject.metadata.columns.forEach((column) => {\n const value = column.getEntityValue(\n subject.generatedMap!,\n )\n if (value !== undefined && value !== null) {\n const preparedValue =\n this.queryRunner.connection.driver.prepareHydratedValue(\n value,\n column,\n )\n column.setEntityValue(\n subject.generatedMap!,\n preparedValue,\n )\n }\n })\n }\n })\n }\n }\n\n /**\n * Updates all given subjects in the database.\n */\n protected async executeUpdateOperations(): Promise<void> {\n const updateSubject = async (subject: Subject) => {\n if (!subject.identifier)\n throw new SubjectWithoutIdentifierError(subject)\n\n // for mongodb we have a bit different updation logic\n if (\n InstanceChecker.isMongoEntityManager(this.queryRunner.manager)\n ) {\n const partialEntity = this.cloneMongoSubjectEntity(subject)\n if (\n subject.metadata.objectIdColumn &&\n subject.metadata.objectIdColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.objectIdColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.createDateColumn &&\n subject.metadata.createDateColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.createDateColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.updateDateColumn &&\n subject.metadata.updateDateColumn.propertyName\n ) {\n partialEntity[\n subject.metadata.updateDateColumn.propertyName\n ] = new Date()\n }\n\n const manager = this.queryRunner.manager as MongoEntityManager\n\n await manager.update(\n subject.metadata.target,\n subject.identifier,\n partialEntity,\n )\n } else {\n const updateMap: ObjectLiteral =\n subject.createValueSetAndPopChangeMap()\n\n // for tree tables we execute additional queries\n switch (subject.metadata.treeType) {\n case \"nested-set\":\n await new NestedSetSubjectExecutor(\n this.queryRunner,\n ).update(subject)\n break\n\n case \"closure-table\":\n await new ClosureSubjectExecutor(\n this.queryRunner,\n ).update(subject)\n break\n\n case \"materialized-path\":\n await new MaterializedPathSubjectExecutor(\n this.queryRunner,\n ).update(subject)\n break\n }\n\n // here we execute our updation query\n // we need to enable entity updation because we update a subject identifier\n // which is not same object as our entity that's why we don't need to worry about our entity to get dirty\n // also, we disable listeners because we call them on our own in persistence layer\n const updateQueryBuilder = this.queryRunner.manager\n .createQueryBuilder()\n .update(subject.metadata.target)\n .set(updateMap)\n .updateEntity(\n this.options && this.options.reload === false\n ? false\n : true,\n )\n .callListeners(false)\n\n if (subject.entity) {\n updateQueryBuilder.whereEntity(subject.identifier)\n } else {\n // in this case identifier is just conditions object to update by\n updateQueryBuilder.where(subject.identifier)\n }\n\n const updateResult = await updateQueryBuilder.execute()\n const updateGeneratedMap = updateResult.generatedMaps[0]\n if (updateGeneratedMap) {\n subject.metadata.columns.forEach((column) => {\n const value = column.getEntityValue(updateGeneratedMap!)\n if (value !== undefined && value !== null) {\n const preparedValue =\n this.queryRunner.connection.driver.prepareHydratedValue(\n value,\n column,\n )\n column.setEntityValue(\n updateGeneratedMap!,\n preparedValue,\n )\n }\n })\n if (!subject.generatedMap) {\n subject.generatedMap = {}\n }\n Object.assign(subject.generatedMap, updateGeneratedMap)\n }\n }\n }\n\n // Nested sets need to be updated one by one\n // Split array in two, one with nested set subjects and the other with the remaining subjects\n const nestedSetSubjects: Subject[] = []\n const remainingSubjects: Subject[] = []\n\n for (const subject of this.updateSubjects) {\n if (subject.metadata.treeType === \"nested-set\") {\n nestedSetSubjects.push(subject)\n } else {\n remainingSubjects.push(subject)\n }\n }\n\n // Run nested set updates one by one\n const updateNestSetSubjects = async () => {\n for (const subject of nestedSetSubjects) {\n await updateSubject(subject)\n }\n }\n\n // Run all remaining subjects in parallel\n await Promise.all([\n ...remainingSubjects.map(updateSubject),\n updateNestSetSubjects(),\n ])\n }\n\n /**\n * Removes all given subjects from the database.\n *\n * todo: we need to apply topological sort here as well\n */\n protected async executeRemoveOperations(): Promise<void> {\n // group insertion subjects to make bulk insertions\n const [groupedRemoveSubjects, groupedRemoveSubjectKeys] =\n this.groupBulkSubjects(this.removeSubjects, \"delete\")\n\n for (const groupName of groupedRemoveSubjectKeys) {\n const subjects = groupedRemoveSubjects[groupName]\n const deleteMaps = subjects.map((subject) => {\n if (!subject.identifier)\n throw new SubjectWithoutIdentifierError(subject)\n\n return subject.identifier\n })\n\n // for mongodb we have a bit different updation logic\n if (\n InstanceChecker.isMongoEntityManager(this.queryRunner.manager)\n ) {\n const manager = this.queryRunner.manager as MongoEntityManager\n await manager.delete(subjects[0].metadata.target, deleteMaps)\n } else {\n // for tree tables we execute additional queries\n switch (subjects[0].metadata.treeType) {\n case \"nested-set\":\n await new NestedSetSubjectExecutor(\n this.queryRunner,\n ).remove(subjects)\n break\n\n case \"closure-table\":\n await new ClosureSubjectExecutor(\n this.queryRunner,\n ).remove(subjects)\n break\n }\n\n // here we execute our deletion query\n // we don't need to specify entities and set update entity to true since the only thing query builder\n // will do for use is a primary keys deletion which is handled by us later once persistence is finished\n // also, we disable listeners because we call them on our own in persistence layer\n await this.queryRunner.manager\n .createQueryBuilder()\n .delete()\n .from(subjects[0].metadata.target)\n .where(deleteMaps)\n .callListeners(false)\n .execute()\n }\n }\n }\n\n private cloneMongoSubjectEntity(subject: Subject): ObjectLiteral {\n const target: ObjectLiteral = {}\n\n if (subject.entity) {\n for (const column of subject.metadata.columns) {\n OrmUtils.mergeDeep(\n target,\n column.getEntityValueMap(subject.entity),\n )\n }\n }\n\n return target\n }\n\n /**\n * Soft-removes all given subjects in the database.\n */\n protected async executeSoftRemoveOperations(): Promise<void> {\n await Promise.all(\n this.softRemoveSubjects.map(async (subject) => {\n if (!subject.identifier)\n throw new SubjectWithoutIdentifierError(subject)\n\n let updateResult: UpdateResult\n\n // for mongodb we have a bit different updation logic\n if (\n InstanceChecker.isMongoEntityManager(\n this.queryRunner.manager,\n )\n ) {\n const partialEntity = this.cloneMongoSubjectEntity(subject)\n if (\n subject.metadata.objectIdColumn &&\n subject.metadata.objectIdColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.objectIdColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.createDateColumn &&\n subject.metadata.createDateColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.createDateColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.updateDateColumn &&\n subject.metadata.updateDateColumn.propertyName\n ) {\n partialEntity[\n subject.metadata.updateDateColumn.propertyName\n ] = new Date()\n }\n\n if (\n subject.metadata.deleteDateColumn &&\n subject.metadata.deleteDateColumn.propertyName\n ) {\n partialEntity[\n subject.metadata.deleteDateColumn.propertyName\n ] = new Date()\n }\n\n const manager = this.queryRunner\n .manager as MongoEntityManager\n\n updateResult = await manager.update(\n subject.metadata.target,\n subject.identifier,\n partialEntity,\n )\n } else {\n // here we execute our soft-deletion query\n // we need to enable entity soft-deletion because we update a subject identifier\n // which is not same object as our entity that's why we don't need to worry about our entity to get dirty\n // also, we disable listeners because we call them on our own in persistence layer\n const softDeleteQueryBuilder = this.queryRunner.manager\n .createQueryBuilder()\n .softDelete()\n .from(subject.metadata.target)\n .updateEntity(\n this.options && this.options.reload === false\n ? false\n : true,\n )\n .callListeners(false)\n\n if (subject.entity) {\n softDeleteQueryBuilder.whereEntity(subject.identifier)\n } else {\n // in this case identifier is just conditions object to update by\n softDeleteQueryBuilder.where(subject.identifier)\n }\n\n updateResult = await softDeleteQueryBuilder.execute()\n }\n\n subject.generatedMap = updateResult.generatedMaps[0]\n if (subject.generatedMap) {\n subject.metadata.columns.forEach((column) => {\n const value = column.getEntityValue(\n subject.generatedMap!,\n )\n if (value !== undefined && value !== null) {\n const preparedValue =\n this.queryRunner.connection.driver.prepareHydratedValue(\n value,\n column,\n )\n column.setEntityValue(\n subject.generatedMap!,\n preparedValue,\n )\n }\n })\n }\n\n // experiments, remove probably, need to implement tree tables children removal\n // if (subject.updatedRelationMaps.length > 0) {\n // await Promise.all(subject.updatedRelationMaps.map(async updatedRelation => {\n // if (!updatedRelation.relation.isTreeParent) return;\n // if (!updatedRelation.value !== null) return;\n //\n // if (subject.metadata.treeType === \"closure-table\") {\n // await new ClosureSubjectExecutor(this.queryRunner).deleteChildrenOf(subject);\n // }\n // }));\n // }\n }),\n )\n }\n\n /**\n * Recovers all given subjects in the database.\n */\n protected async executeRecoverOperations(): Promise<void> {\n await Promise.all(\n this.recoverSubjects.map(async (subject) => {\n if (!subject.identifier)\n throw new SubjectWithoutIdentifierError(subject)\n\n let updateResult: UpdateResult\n\n // for mongodb we have a bit different updation logic\n if (\n InstanceChecker.isMongoEntityManager(\n this.queryRunner.manager,\n )\n ) {\n const partialEntity = this.cloneMongoSubjectEntity(subject)\n if (\n subject.metadata.objectIdColumn &&\n subject.metadata.objectIdColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.objectIdColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.createDateColumn &&\n subject.metadata.createDateColumn.propertyName\n ) {\n delete partialEntity[\n subject.metadata.createDateColumn.propertyName\n ]\n }\n\n if (\n subject.metadata.updateDateColumn &&\n subject.metadata.updateDateColumn.propertyName\n ) {\n partialEntity[\n subject.metadata.updateDateColumn.propertyName\n ] = new Date()\n }\n\n if (\n subject.metadata.deleteDateColumn &&\n subject.metadata.deleteDateColumn.propertyName\n ) {\n partialEntity[\n subject.metadata.deleteDateColumn.propertyName\n ] = null\n }\n\n const manager = this.queryRunner\n .manager as MongoEntityManager\n\n updateResult = await manager.update(\n subject.metadata.target,\n subject.identifier,\n partialEntity,\n )\n } else {\n // here we execute our restory query\n // we need to enable entity restory because we update a subject identifier\n // which is not same object as our entity that's why we don't need to worry about our entity to get dirty\n // also, we disable listeners because we call them on our own in persistence layer\n const softDeleteQueryBuilder = this.queryRunner.manager\n .createQueryBuilder()\n .restore()\n .from(subject.metadata.target)\n .updateEntity(\n this.options && this.options.reload === false\n ? false\n : true,\n )\n .callListeners(false)\n\n if (subject.entity) {\n softDeleteQueryBuilder.whereEntity(subject.identifier)\n } else {\n // in this case identifier is just conditions object to update by\n softDeleteQueryBuilder.where(subject.identifier)\n }\n\n updateResult = await softDeleteQueryBuilder.execute()\n }\n\n subject.generatedMap = updateResult.generatedMaps[0]\n if (subject.generatedMap) {\n subject.metadata.columns.forEach((column) => {\n const value = column.getEntityValue(\n subject.generatedMap!,\n )\n if (value !== undefined && value !== null) {\n const preparedValue =\n this.queryRunner.connection.driver.prepareHydratedValue(\n value,\n column,\n )\n column.setEntityValue(\n subject.generatedMap!,\n preparedValue,\n )\n }\n })\n }\n\n // experiments, remove probably, need to implement tree tables children removal\n // if (subject.updatedRelationMaps.length > 0) {\n // await Promise.all(subject.updatedRelationMaps.map(async updatedRelation => {\n // if (!updatedRelation.relation.isTreeParent) return;\n // if (!updatedRelation.value !== null) return;\n //\n // if (subject.metadata.treeType === \"closure-table\") {\n // await new ClosureSubjectExecutor(this.queryRunner).deleteChildrenOf(subject);\n // }\n // }));\n // }\n }),\n )\n }\n\n /**\n * Updates all special columns of the saving entities (create date, update date, version, etc.).\n * Also updates nullable columns and columns with default values.\n */\n protected updateSpecialColumnsInPersistedEntities(): void {\n // update inserted entity properties\n if (this.insertSubjects.length)\n this.updateSpecialColumnsInInsertedAndUpdatedEntities(\n this.insertSubjects,\n )\n\n // update updated entity properties\n if (this.updateSubjects.length)\n this.updateSpecialColumnsInInsertedAndUpdatedEntities(\n this.updateSubjects,\n )\n\n // update soft-removed entity properties\n if (this.softRemoveSubjects.length)\n this.updateSpecialColumnsInInsertedAndUpdatedEntities(\n this.softRemoveSubjects,\n )\n\n // update recovered entity properties\n if (this.recoverSubjects.length)\n this.updateSpecialColumnsInInsertedAndUpdatedEntities(\n this.recoverSubjects,\n )\n\n // remove ids from the entities that were removed\n if (this.removeSubjects.length) {\n this.removeSubjects.forEach((subject) => {\n if (!subject.entity) return\n\n subject.metadata.primaryColumns.forEach((primaryColumn) => {\n primaryColumn.setEntityValue(subject.entity!, undefined)\n })\n })\n }\n\n // other post-persist updations\n this.allSubjects.forEach((subject) => {\n if (!subject.entity) return\n\n subject.metadata.relationIds.forEach((relationId) => {\n relationId.setValue(subject.entity!)\n })\n\n // mongo _id remove\n if (\n InstanceChecker.isMongoEntityManager(this.queryRunner.manager)\n ) {\n if (\n subject.metadata.objectIdColumn &&\n subject.metadata.objectIdColumn.databaseName &&\n subject.metadata.objectIdColumn.databaseName !==\n subject.metadata.objectIdColumn.propertyName\n ) {\n delete subject.entity[\n subject.metadata.objectIdColumn.databaseName\n ]\n }\n }\n })\n }\n\n /**\n * Updates all special columns of the saving entities (create date, update date, version, etc.).\n * Also updates nullable columns and columns with default values.\n */\n protected updateSpecialColumnsInInsertedAndUpdatedEntities(\n subjects: Subject[],\n ): void {\n subjects.forEach((subject) => {\n if (!subject.entity) return\n\n // set values to \"null\" for nullable columns that did not have values\n subject.metadata.columns.forEach((column) => {\n // if table inheritance is used make sure this column is not child's column\n if (\n subject.metadata.childEntityMetadatas.length > 0 &&\n subject.metadata.childEntityMetadatas\n .map((metadata) => metadata.target)\n .indexOf(column.target) !== -1\n )\n return\n\n // entities does not have virtual columns\n if (column.isVirtual) return\n\n // if column is deletedAt\n if (column.isDeleteDate) return\n\n // update nullable columns\n if (column.isNullable) {\n const columnValue = column.getEntityValue(subject.entity!)\n if (columnValue === undefined)\n column.setEntityValue(subject.entity!, null)\n }\n\n // update relational columns\n if (subject.updatedRelationMaps.length > 0) {\n subject.updatedRelationMaps.forEach(\n (updatedRelationMap) => {\n updatedRelationMap.relation.joinColumns.forEach(\n (column) => {\n if (column.isVirtual === true) return\n\n column.setEntityValue(\n subject.entity!,\n ObjectUtils.isObject(\n updatedRelationMap.value,\n )\n ? column.referencedColumn!.getEntityValue(\n updatedRelationMap.value,\n )\n : updatedRelationMap.value,\n )\n },\n )\n },\n )\n }\n })\n\n // merge into entity all generated values returned by a database\n if (subject.generatedMap)\n this.queryRunner.manager.merge(\n subject.metadata.target,\n subject.entity,\n subject.generatedMap,\n )\n })\n }\n\n /**\n * Groups subjects by metadata names (by tables) to make bulk insertions and deletions possible.\n * However there are some limitations with bulk insertions of data into tables with generated (increment) columns\n * in some drivers. Some drivers like mysql and sqlite does not support returning multiple generated columns\n * after insertion and can only return a single generated column value, that's why its not possible to do bulk insertion,\n * because it breaks insertion result's generatedMap and leads to problems when this subject is used in other subjects saves.\n * That's why we only support bulking in junction tables for those drivers.\n *\n * Other drivers like postgres and sql server support RETURNING / OUTPUT statement which allows to return generated\n * id for each inserted row, that's why bulk insertion is not limited to junction tables in there.\n */\n protected groupBulkSubjects(\n subjects: Subject[],\n type: \"insert\" | \"delete\",\n ): [{ [key: string]: Subject[] }, string[]] {\n const group: { [key: string]: Subject[] } = {}\n const keys: string[] = []\n const hasReturningDependColumns = subjects.some((subject) => {\n return subject.metadata.getInsertionReturningColumns().length > 0\n })\n const groupingAllowed =\n type === \"delete\" ||\n this.queryRunner.connection.driver.isReturningSqlSupported(\n \"insert\",\n ) ||\n hasReturningDependColumns === false\n\n subjects.forEach((subject, index) => {\n const key =\n groupingAllowed || subject.metadata.isJunction\n ? subject.metadata.name\n : subject.metadata.name + \"_\" + index\n if (!group[key]) {\n group[key] = [subject]\n keys.push(key)\n } else {\n group[key].push(subject)\n }\n })\n\n return [group, keys]\n }\n}\n"],"sourceRoot":".."}
|