222
schangxiang@126.com
2025-06-13 6a8393408d8cefcea02b7a598967de8dc1e565c2
1
{"version":3,"sources":["../../src/persistence/tree/ClosureSubjectExecutor.ts"],"names":[],"mappings":"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","file":"ClosureSubjectExecutor.js","sourcesContent":["import {Subject} from \"../Subject\";\nimport {QueryRunner} from \"../../query-runner/QueryRunner\";\nimport {ObjectLiteral} from \"../../common/ObjectLiteral\";\nimport {CannotAttachTreeChildrenEntityError} from \"../../error/CannotAttachTreeChildrenEntityError\";\n\n/**\n * Executes subject operations for closure entities.\n */\nexport class ClosureSubjectExecutor {\n\n    // -------------------------------------------------------------------------\n    // Constructor\n    // -------------------------------------------------------------------------\n\n    constructor(protected queryRunner: QueryRunner) {\n    }\n\n    // -------------------------------------------------------------------------\n    // Public Methods\n    // -------------------------------------------------------------------------\n\n    /**\n     * Removes all children of the given subject's entity.\n\n    async deleteChildrenOf(subject: Subject) {\n        // const relationValue = subject.metadata.treeParentRelation.getEntityValue(subject.databaseEntity);\n        // console.log(\"relationValue: \", relationValue);\n        // this.queryRunner.manager\n        //     .createQueryBuilder()\n        //     .from(subject.metadata.closureJunctionTable.target, \"tree\")\n        //     .where(\"tree.\");\n    }*/\n\n    /**\n     * Executes operations when subject is being inserted.\n     */\n    async insert(subject: Subject): Promise<void> {\n\n        // create values to be inserted into the closure junction\n        const closureJunctionInsertMap: ObjectLiteral = {};\n        subject.metadata.closureJunctionTable.ancestorColumns.forEach(column => {\n            closureJunctionInsertMap[column.databaseName] = subject.identifier;\n        });\n        subject.metadata.closureJunctionTable.descendantColumns.forEach(column => {\n            closureJunctionInsertMap[column.databaseName] = subject.identifier;\n        });\n\n        // insert values into the closure junction table\n        await this.queryRunner\n            .manager\n            .createQueryBuilder()\n            .insert()\n            .into(subject.metadata.closureJunctionTable.tablePath)\n            .values(closureJunctionInsertMap)\n            .updateEntity(false)\n            .callListeners(false)\n            .execute();\n\n        let parent = subject.metadata.treeParentRelation!.getEntityValue(subject.entity!); // if entity was attached via parent\n        if (!parent && subject.parentSubject && subject.parentSubject.entity) // if entity was attached via children\n            parent = subject.parentSubject.insertedValueSet ? subject.parentSubject.insertedValueSet : subject.parentSubject.entity;\n\n        if (parent) {\n            const escape = (alias: string) => this.queryRunner.connection.driver.escape(alias);\n            const tableName = this.getTableName(subject.metadata.closureJunctionTable.tablePath);\n            const ancestorColumnNames = subject.metadata.closureJunctionTable.ancestorColumns.map(column => {\n                return escape(column.databaseName);\n            });\n            const descendantColumnNames = subject.metadata.closureJunctionTable.descendantColumns.map(column => {\n                return escape(column.databaseName);\n            });\n            const firstQueryParameters: any[] = [];\n            const childEntityIdValues = subject.metadata.primaryColumns.map(column => column.getEntityValue(subject.insertedValueSet!));\n            const childEntityIds1 = subject.metadata.primaryColumns.map((column, index) => {\n                firstQueryParameters.push(childEntityIdValues[index]);\n                return this.queryRunner.connection.driver.createParameter(\"child_entity_\" + column.databaseName, firstQueryParameters.length - 1);\n            });\n            const whereCondition = subject.metadata.primaryColumns.map(column => {\n                const columnName = escape(column.databaseName + \"_descendant\");\n                const parentId = column.getEntityValue(parent);\n                if (!parentId)\n                    throw new CannotAttachTreeChildrenEntityError(subject.metadata.name);\n\n                firstQueryParameters.push(parentId);\n                const parameterName = this.queryRunner.connection.driver.createParameter(\"parent_entity_\" + column.databaseName, firstQueryParameters.length - 1);\n                return columnName + \" = \" + parameterName;\n            }).join(\", \");\n\n            await this.queryRunner.query(\n                `INSERT INTO ${tableName} (${[...ancestorColumnNames, ...descendantColumnNames].join(\", \")}) ` +\n                `SELECT ${ancestorColumnNames.join(\", \")}, ${childEntityIds1.join(\", \")} FROM ${tableName} WHERE ${whereCondition}`,\n                firstQueryParameters\n            );\n        }\n    }\n\n    /**\n     * Gets escaped table name with schema name if SqlServer or Postgres driver used with custom\n     * schema name, otherwise returns escaped table name.\n     */\n    protected getTableName(tablePath: string): string {\n        return tablePath.split(\".\")\n            .map(i => {\n                // this condition need because in SQL Server driver when custom database name was specified and schema name was not, we got `dbName..tableName` string, and doesn't need to escape middle empty string\n                if (i === \"\")\n                    return i;\n                return this.queryRunner.connection.driver.escape(i);\n            }).join(\".\");\n    }\n\n\n}"],"sourceRoot":"../.."}