schangxiang@126.com
2025-09-19 0821aa23eabe557c0d9ef5dbe6989c68be35d1fe
1
{"version":3,"sources":["../../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 {PromiseUtils} from \"../util/PromiseUtils\";\nimport {SubjectTopoligicalSorter} from \"./SubjectTopoligicalSorter\";\nimport {SubjectChangedColumnsComputer} from \"./SubjectChangedColumnsComputer\";\nimport {SubjectWithoutIdentifierError} from \"../error/SubjectWithoutIdentifierError\";\nimport {SubjectRemovedAndUpdatedError} from \"../error/SubjectRemovedAndUpdatedError\";\nimport {MongoQueryRunner} from \"../driver/mongodb/MongoQueryRunner\";\nimport {MongoEntityManager} from \"../entity-manager/MongoEntityManager\";\nimport {MongoDriver} from \"../driver/mongodb/MongoDriver\";\nimport {ObjectLiteral} from \"../common/ObjectLiteral\";\nimport {SaveOptions} from \"../repository/SaveOptions\";\nimport {RemoveOptions} from \"../repository/RemoveOptions\";\nimport {BroadcasterResult} from \"../subscriber/BroadcasterResult\";\nimport {OracleDriver} from \"../driver/oracle/OracleDriver\";\nimport {NestedSetSubjectExecutor} from \"./tree/NestedSetSubjectExecutor\";\nimport {ClosureSubjectExecutor} from \"./tree/ClosureSubjectExecutor\";\nimport {MaterializedPathSubjectExecutor} from \"./tree/MaterializedPathSubjectExecutor\";\nimport {OrmUtils} from \"../util/OrmUtils\";\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    // -------------------------------------------------------------------------\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    // Constructor\n    // -------------------------------------------------------------------------\n\n    constructor(queryRunner: QueryRunner, subjects: Subject[], options?: SaveOptions & RemoveOptions) {\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) 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.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 SubjectTopoligicalSorter(this.insertSubjects).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(subject => subject.mustBeUpdated);\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 SubjectTopoligicalSorter(this.removeSubjects).sort(\"delete\");\n        await this.executeRemoveOperations();\n        // console.timeEnd(\".removal\");\n\n        // update all special columns in persisted entities, like inserted id or remove ids from the removed entities\n        // console.time(\".updateSpecialColumnsInPersistedEntities\");\n        await 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) 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(subject => subject.mustBeInserted);\n        this.updateSubjects = this.allSubjects.filter(subject => subject.mustBeUpdated);\n        this.removeSubjects = this.allSubjects.filter(subject => subject.mustBeRemoved);\n        this.hasExecutableOperations = this.insertSubjects.length > 0 || this.updateSubjects.length > 0 || this.removeSubjects.length > 0;\n    }\n\n    /**\n     * Broadcasts \"BEFORE_INSERT\", \"BEFORE_UPDATE\", \"BEFORE_REMOVE\" 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 => this.queryRunner.broadcaster.broadcastBeforeInsertEvent(result, subject.metadata, subject.entity!));\n        if (this.updateSubjects.length)\n            this.updateSubjects.forEach(subject => this.queryRunner.broadcaster.broadcastBeforeUpdateEvent(result, subject.metadata, subject.entity!, subject.databaseEntity, subject.diffColumns, subject.diffRelations));\n        if (this.removeSubjects.length)\n            this.removeSubjects.forEach(subject => this.queryRunner.broadcaster.broadcastBeforeRemoveEvent(result, subject.metadata, subject.entity!, subject.databaseEntity));\n        return result;\n    }\n\n    /**\n     * Broadcasts \"AFTER_INSERT\", \"AFTER_UPDATE\", \"AFTER_REMOVE\" 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 => this.queryRunner.broadcaster.broadcastAfterInsertEvent(result, subject.metadata, subject.entity!));\n        if (this.updateSubjects.length)\n            this.updateSubjects.forEach(subject => this.queryRunner.broadcaster.broadcastAfterUpdateEvent(result, subject.metadata, subject.entity!, subject.databaseEntity, subject.diffColumns, subject.diffRelations));\n        if (this.removeSubjects.length)\n            this.removeSubjects.forEach(subject => this.queryRunner.broadcaster.broadcastAfterRemoveEvent(result, subject.metadata, subject.entity!, subject.databaseEntity));\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] = 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        await PromiseUtils.runInSequence(groupedInsertSubjectKeys, async groupName => {\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 instanceof MongoDriver) {\n                subjects.forEach(subject => {\n                    if (subject.metadata.createDateColumn && subject.entity) {\n                        subject.entity[subject.metadata.createDateColumn.databaseName] = new Date();\n                    }\n\n                    if (subject.metadata.updateDateColumn && subject.entity) {\n                        subject.entity[subject.metadata.updateDateColumn.databaseName] = new Date();\n                    }\n\n                    subject.createValueSetAndPopChangeMap();\n\n                    bulkInsertSubjects.push(subject);\n                    bulkInsertMaps.push(subject.entity!);\n                });\n            } else if (this.queryRunner.connection.driver instanceof OracleDriver) {\n                subjects.forEach(subject => {\n                    singleInsertSubjects.push(subject);\n                });\n            } else {\n                subjects.forEach(subject => {\n\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 (subject.changeMaps.length === 0 ||\n                        subject.metadata.treeType ||\n                        this.queryRunner.connection.driver instanceof OracleDriver) {\n                        singleInsertSubjects.push(subject);\n\n                    } else {\n                        bulkInsertSubjects.push(subject);\n                        bulkInsertMaps.push(subject.createValueSetAndPopChangeMap());\n                    }\n                });\n            }\n\n            // for mongodb we have a bit different insertion logic\n            if (this.queryRunner instanceof MongoQueryRunner) {\n                const manager = this.queryRunner.manager as MongoEntityManager;\n                const insertResult = await manager.insert(subjects[0].metadata.target, bulkInsertMaps);\n                subjects.forEach((subject, index) => {\n                    subject.identifier = insertResult.identifiers[index];\n                    subject.generatedMap = insertResult.generatedMaps[index];\n                    subject.insertedValueSet = bulkInsertMaps[index];\n                });\n\n            } else {\n\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\n                        .manager\n                        .createQueryBuilder()\n                        .insert()\n                        .into(subjects[0].metadata.target)\n                        .values(bulkInsertMaps)\n                        .updateEntity(this.options && this.options.reload === false ? false : true)\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                    await PromiseUtils.runInSequence(singleInsertSubjects, async subject => {\n                        subject.insertedValueSet = 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(this.queryRunner).insert(subject);\n\n                        await this.queryRunner\n                            .manager\n                            .createQueryBuilder()\n                            .insert()\n                            .into(subject.metadata.target)\n                            .values(subject.insertedValueSet)\n                            .updateEntity(this.options && this.options.reload === false ? false : true)\n                            .callListeners(false)\n                            .execute()\n                            .then(insertResult => {\n                                subject.identifier = insertResult.identifiers[0];\n                                subject.generatedMap = insertResult.generatedMaps[0];\n                            });\n\n                        // for tree tables we execute additional queries\n                        if (subject.metadata.treeType === \"closure-table\") {\n                            await new ClosureSubjectExecutor(this.queryRunner).insert(subject);\n\n                        } else if (subject.metadata.treeType === \"materialized-path\") {\n                            await new MaterializedPathSubjectExecutor(this.queryRunner).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(subject.generatedMap!);\n                        if (value !== undefined && value !== null) {\n                            const preparedValue = this.queryRunner.connection.driver.prepareHydratedValue(value, column);\n                            column.setEntityValue(subject.generatedMap!, preparedValue);\n                        }\n                    });\n                }\n            });\n        });\n    }\n\n    /**\n     * Updates all given subjects in the database.\n     */\n    protected async executeUpdateOperations(): Promise<void> {\n        await Promise.all(this.updateSubjects.map(async subject => {\n\n            if (!subject.identifier)\n                throw new SubjectWithoutIdentifierError(subject);\n\n            // for mongodb we have a bit different updation logic\n            if (this.queryRunner instanceof MongoQueryRunner) {\n                const partialEntity = OrmUtils.mergeDeep({}, subject.entity!);\n                if (subject.metadata.objectIdColumn && subject.metadata.objectIdColumn.propertyName) {\n                    delete partialEntity[subject.metadata.objectIdColumn.propertyName];\n                }\n\n                if (subject.metadata.createDateColumn && subject.metadata.createDateColumn.propertyName) {\n                    delete partialEntity[subject.metadata.createDateColumn.propertyName];\n                }\n\n                if (subject.metadata.updateDateColumn && subject.metadata.updateDateColumn.propertyName) {\n                    partialEntity[subject.metadata.updateDateColumn.propertyName] = new Date();\n                }\n\n                const manager = this.queryRunner.manager as MongoEntityManager;\n\n                await manager.update(subject.metadata.target, subject.identifier, partialEntity);\n\n            } else {\n\n                const updateMap: ObjectLiteral = subject.createValueSetAndPopChangeMap();\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\n                    .manager\n                    .createQueryBuilder()\n                    .update(subject.metadata.target)\n                    .set(updateMap)\n                    .updateEntity(this.options && this.options.reload === false ? false : true)\n                    .callListeners(false);\n\n                if (subject.entity) {\n                    updateQueryBuilder.whereEntity(subject.identifier);\n\n                } else { // 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                subject.generatedMap = updateResult.generatedMaps[0];\n                if (subject.generatedMap) {\n                    subject.metadata.columns.forEach(column => {\n                        const value = column.getEntityValue(subject.generatedMap!);\n                        if (value !== undefined && value !== null) {\n                            const preparedValue = this.queryRunner.connection.driver.prepareHydratedValue(value, column);\n                            column.setEntityValue(subject.generatedMap!, preparedValue);\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     * 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] = this.groupBulkSubjects(this.removeSubjects, \"delete\");\n\n        await PromiseUtils.runInSequence(groupedRemoveSubjectKeys, async groupName => {\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 (this.queryRunner instanceof MongoQueryRunner) {\n                const manager = this.queryRunner.manager as MongoEntityManager;\n                await manager.delete(subjects[0].metadata.target, deleteMaps);\n\n            } else {\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\n                    .manager\n                    .createQueryBuilder()\n                    .delete()\n                    .from(subjects[0].metadata.target)\n                    .where(deleteMaps)\n                    .callListeners(false)\n                    .execute();\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\n        // update inserted entity properties\n        if (this.insertSubjects.length)\n            this.updateSpecialColumnsInInsertedAndUpdatedEntities(this.insertSubjects);\n\n        // update updated entity properties\n        if (this.updateSubjects.length)\n            this.updateSpecialColumnsInInsertedAndUpdatedEntities(this.updateSubjects);\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 (this.queryRunner instanceof MongoQueryRunner) {\n                if (subject.metadata.objectIdColumn\n                    && subject.metadata.objectIdColumn.databaseName\n                    && subject.metadata.objectIdColumn.databaseName !== subject.metadata.objectIdColumn.propertyName\n                ) {\n                    delete subject.entity[subject.metadata.objectIdColumn.databaseName];\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(subjects: Subject[]): 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\n                // if table inheritance is used make sure this column is not child's column\n                if (subject.metadata.childEntityMetadatas.length > 0 && subject.metadata.childEntityMetadatas.map(metadata => metadata.target).indexOf(column.target) !== -1)\n                    return;\n\n                // entities does not have virtual columns\n                if (column.isVirtual)\n                    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(updatedRelationMap => {\n                        updatedRelationMap.relation.joinColumns.forEach(column => {\n                            if (column.isVirtual === true)\n                                return;\n\n                            column.setEntityValue(subject.entity!, updatedRelationMap.value instanceof Object ? column.referencedColumn!.getEntityValue(updatedRelationMap.value) : updatedRelationMap.value);\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(subject.metadata.target as any, subject.entity, subject.generatedMap);\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(subjects: Subject[], type: \"insert\" | \"delete\"): [{ [key: string]: Subject[] }, string[]] {\n        const group: { [key: string]: Subject[] } = {};\n        const keys: string[] = [];\n        const groupingAllowed = type === \"delete\" || this.queryRunner.connection.driver.isReturningSqlSupported();\n\n        subjects.forEach((subject, index) => {\n            const key = groupingAllowed || subject.metadata.isJunction ? subject.metadata.name : 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}\n"],"sourceRoot":".."}