333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
{"version":3,"sources":["../../src/persistence/tree/NestedSetSubjectExecutor.ts"],"names":[],"mappings":"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","file":"NestedSetSubjectExecutor.js","sourcesContent":["import {Subject} from \"../Subject\";\nimport {QueryRunner} from \"../../query-runner/QueryRunner\";\nimport {OrmUtils} from \"../../util/OrmUtils\";\n\n/**\n * Executes subject operations for nested set tree entities.\n */\nexport class NestedSetSubjectExecutor {\n\n    // -------------------------------------------------------------------------\n    // Constructor\n    // -------------------------------------------------------------------------\n\n    constructor(protected queryRunner: QueryRunner) {\n    }\n\n    // -------------------------------------------------------------------------\n    // Public Methods\n    // -------------------------------------------------------------------------\n\n    /**\n     * Executes operations when subject is being inserted.\n     */\n    async insert(subject: Subject): Promise<void> {\n        const escape = (alias: string) => this.queryRunner.connection.driver.escape(alias);\n        const tableName = this.getTableName(subject.metadata.tablePath);\n        const leftColumnName = escape(subject.metadata.nestedSetLeftColumn!.databaseName);\n        const rightColumnName = escape(subject.metadata.nestedSetRightColumn!.databaseName);\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        const parentId = subject.metadata.getEntityIdMap(parent);\n\n        let parentNsRight: number|undefined = undefined;\n        if (parentId) {\n            parentNsRight = await this.queryRunner.manager\n                .createQueryBuilder()\n                .select(subject.metadata.targetName + \".\" + subject.metadata.nestedSetRightColumn!.propertyPath, \"right\")\n                .from(subject.metadata.target, subject.metadata.targetName)\n                .whereInIds(parentId)\n                .getRawOne()\n                .then(result => {\n                    const value: any = result ? result[\"right\"] : undefined;\n                    // CockroachDB returns numeric types as string\n                    return typeof value === \"string\" ? parseInt(value) : value;\n                });\n        }\n\n        if (parentNsRight !== undefined) {\n            await this.queryRunner.query(`UPDATE ${tableName} SET ` +\n                `${leftColumnName} = CASE WHEN ${leftColumnName} > ${parentNsRight} THEN ${leftColumnName} + 2 ELSE ${leftColumnName} END,` +\n                `${rightColumnName} = ${rightColumnName} + 2 ` +\n                `WHERE ${rightColumnName} >= ${parentNsRight}`);\n\n            OrmUtils.mergeDeep(\n                subject.insertedValueSet,\n                subject.metadata.nestedSetLeftColumn!.createValueMap(parentNsRight),\n                subject.metadata.nestedSetRightColumn!.createValueMap(parentNsRight + 1),\n            );\n        } else {\n            OrmUtils.mergeDeep(\n                subject.insertedValueSet,\n                subject.metadata.nestedSetLeftColumn!.createValueMap(1),\n                subject.metadata.nestedSetRightColumn!.createValueMap(2),\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":"../.."}