333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
{"version":3,"sources":["../../src/find-options/FindOptionsUtils.ts"],"names":[],"mappings":"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","file":"FindOptionsUtils.js","sourcesContent":["import {FindManyOptions} from \"./FindManyOptions\";\nimport {FindOneOptions} from \"./FindOneOptions\";\nimport {SelectQueryBuilder} from \"../query-builder/SelectQueryBuilder\";\nimport {FindRelationsNotFoundError} from \"../error/FindRelationsNotFoundError\";\nimport {EntityMetadata} from \"../metadata/EntityMetadata\";\n\n/**\n * Utilities to work with FindOptions.\n */\nexport class FindOptionsUtils {\n\n    // -------------------------------------------------------------------------\n    // Public Static Methods\n    // -------------------------------------------------------------------------\n\n    /**\n     * Checks if given object is really instance of FindOneOptions interface.\n     */\n    static isFindOneOptions(obj: any): obj is FindOneOptions<any> {\n        const possibleOptions: FindOneOptions<any> = obj;\n        return possibleOptions &&\n                (\n                    possibleOptions.select instanceof Array ||\n                    possibleOptions.where instanceof Object ||\n                    typeof possibleOptions.where === \"string\" ||\n                    possibleOptions.relations instanceof Array ||\n                    possibleOptions.join instanceof Object ||\n                    possibleOptions.order instanceof Object ||\n                    possibleOptions.cache instanceof Object ||\n                    typeof possibleOptions.cache === \"boolean\" ||\n                    typeof possibleOptions.cache === \"number\" ||\n                    possibleOptions.lock instanceof Object ||\n                    possibleOptions.loadRelationIds instanceof Object ||\n                    typeof possibleOptions.loadRelationIds === \"boolean\" ||\n                    typeof possibleOptions.loadEagerRelations === \"boolean\"\n                );\n    }\n\n    /**\n     * Checks if given object is really instance of FindManyOptions interface.\n     */\n    static isFindManyOptions(obj: any): obj is FindManyOptions<any> {\n        const possibleOptions: FindManyOptions<any> = obj;\n        return possibleOptions && (\n            this.isFindOneOptions(possibleOptions) ||\n            typeof (possibleOptions as FindManyOptions<any>).skip === \"number\" ||\n            typeof (possibleOptions as FindManyOptions<any>).take === \"number\" ||\n            typeof (possibleOptions as FindManyOptions<any>).skip === \"string\" ||\n            typeof (possibleOptions as FindManyOptions<any>).take === \"string\"\n        );\n    }\n\n    /**\n     * Checks if given object is really instance of FindOptions interface.\n     */\n    static extractFindManyOptionsAlias(object: any): string|undefined {\n        if (this.isFindManyOptions(object) && object.join)\n            return object.join.alias;\n\n        return undefined;\n    }\n\n    /**\n     * Applies give find many options to the given query builder.\n     */\n    static applyFindManyOptionsOrConditionsToQueryBuilder<T>(qb: SelectQueryBuilder<T>, options: FindManyOptions<T>|Partial<T>|undefined): SelectQueryBuilder<T> {\n        if (this.isFindManyOptions(options))\n            return this.applyOptionsToQueryBuilder(qb, options);\n\n        if (options)\n            return qb.where(options);\n\n        return qb;\n    }\n\n    /**\n     * Applies give find options to the given query builder.\n     */\n    static applyOptionsToQueryBuilder<T>(qb: SelectQueryBuilder<T>, options: FindOneOptions<T>|FindManyOptions<T>|undefined): SelectQueryBuilder<T> {\n\n        // if options are not set then simply return query builder. This is made for simplicity of usage.\n        if (!options || (!this.isFindOneOptions(options) && !this.isFindManyOptions(options)))\n            return qb;\n\n        if (!qb.expressionMap.mainAlias || !qb.expressionMap.mainAlias.hasMetadata)\n            return qb;\n\n        const metadata = qb.expressionMap.mainAlias!.metadata;\n\n        // apply all options from FindOptions\n        if (options.select) {\n            qb.select([]);\n            options.select.forEach(select => {\n                if (!metadata.findColumnWithPropertyPath(String(select)))\n                    throw new Error(`${select} column was not found in the ${metadata.name} entity.`);\n\n                qb.addSelect(qb.alias + \".\" + select);\n            });\n        }\n\n        if (options.where)\n            qb.where(options.where);\n\n        if ((options as FindManyOptions<T>).skip)\n            qb.skip((options as FindManyOptions<T>).skip!);\n\n        if ((options as FindManyOptions<T>).take)\n            qb.take((options as FindManyOptions<T>).take!);\n\n        if (options.order)\n            Object.keys(options.order).forEach(key => {\n                const order = ((options as FindOneOptions<T>).order as any)[key as any];\n\n                if (!metadata.findColumnWithPropertyPath(key))\n                    throw new Error(`${key} column was not found in the ${metadata.name} entity.`);\n\n                switch (order) {\n                    case 1:\n                        qb.addOrderBy(qb.alias + \".\" + key, \"ASC\");\n                        break;\n                    case -1:\n                        qb.addOrderBy(qb.alias + \".\" + key, \"DESC\");\n                        break;\n                    case \"ASC\":\n                        qb.addOrderBy(qb.alias + \".\" + key, \"ASC\");\n                        break;\n                    case \"DESC\":\n                        qb.addOrderBy(qb.alias + \".\" + key, \"DESC\");\n                        break;\n                }\n            });\n\n        if (options.relations) {\n            const allRelations = options.relations.map(relation => relation);\n            this.applyRelationsRecursively(qb, allRelations, qb.expressionMap.mainAlias!.name, qb.expressionMap.mainAlias!.metadata, \"\");\n            // recursive removes found relations from allRelations array\n            // if there are relations left in this array it means those relations were not found in the entity structure\n            // so, we give an exception about not found relations\n            if (allRelations.length > 0)\n                throw new FindRelationsNotFoundError(allRelations);\n        }\n\n        if (options.join) {\n            if (options.join.leftJoin)\n                Object.keys(options.join.leftJoin).forEach(key => {\n                    qb.leftJoin(options.join!.leftJoin![key], key);\n                });\n\n            if (options.join.innerJoin)\n                Object.keys(options.join.innerJoin).forEach(key => {\n                    qb.innerJoin(options.join!.innerJoin![key], key);\n                });\n\n            if (options.join.leftJoinAndSelect)\n                Object.keys(options.join.leftJoinAndSelect).forEach(key => {\n                    qb.leftJoinAndSelect(options.join!.leftJoinAndSelect![key], key);\n                });\n\n            if (options.join.innerJoinAndSelect)\n                Object.keys(options.join.innerJoinAndSelect).forEach(key => {\n                    qb.innerJoinAndSelect(options.join!.innerJoinAndSelect![key], key);\n                });\n        }\n\n        if (options.cache) {\n            if (options.cache instanceof Object) {\n                const cache = options.cache as { id: any, milliseconds: number };\n                qb.cache(cache.id, cache.milliseconds);\n            } else {\n                qb.cache(options.cache);\n            }\n        }\n\n        if (options.lock) {\n            if (options.lock.mode === \"optimistic\") {\n                qb.setLock(options.lock.mode, options.lock.version as any);\n            } else if (options.lock.mode === \"pessimistic_read\" || options.lock.mode === \"pessimistic_write\") {\n                qb.setLock(options.lock.mode);\n            }\n        }\n\n        if (options.loadRelationIds === true) {\n            qb.loadAllRelationIds();\n\n        } else if (options.loadRelationIds instanceof Object) {\n            qb.loadAllRelationIds(options.loadRelationIds as any);\n        }\n\n        return qb;\n    }\n\n    // -------------------------------------------------------------------------\n    // Protected Static Methods\n    // -------------------------------------------------------------------------\n\n    /**\n     * Adds joins for all relations and sub-relations of the given relations provided in the find options.\n     */\n    protected static applyRelationsRecursively(qb: SelectQueryBuilder<any>, allRelations: string[], alias: string, metadata: EntityMetadata, prefix: string): void {\n\n        // find all relations that match given prefix\n        let matchedBaseRelations: string[] = [];\n        if (prefix) {\n            const regexp = new RegExp(\"^\" + prefix.replace(\".\", \"\\\\.\") + \"\\\\.\");\n            matchedBaseRelations = allRelations\n                .filter(relation => relation.match(regexp))\n                .map(relation => relation.replace(regexp, \"\"))\n                .filter(relation => metadata.findRelationWithPropertyPath(relation));\n        } else {\n            matchedBaseRelations = allRelations.filter(relation => metadata.findRelationWithPropertyPath(relation));\n        }\n\n        // go through all matched relations and add join for them\n        matchedBaseRelations.forEach(relation => {\n\n            // add a join for the found relation\n            const selection = alias + \".\" + relation;\n            qb.leftJoinAndSelect(selection, alias + \"__\" + relation);\n\n            // join the eager relations of the found relation\n            const relMetadata = metadata.relations.find(metadata => metadata.propertyName === relation);\n            if (relMetadata) {\n                this.joinEagerRelations(qb, alias + \"__\" + relation, relMetadata.inverseEntityMetadata);\n            }\n\n            // remove added relations from the allRelations array, this is needed to find all not found relations at the end\n            allRelations.splice(allRelations.indexOf(prefix ? prefix + \".\" + relation : relation), 1);\n\n            // try to find sub-relations\n            const join = qb.expressionMap.joinAttributes.find(join => join.entityOrProperty === selection);\n            this.applyRelationsRecursively(qb, allRelations, join!.alias.name, join!.metadata!, prefix ? prefix + \".\" + relation : relation);\n        });\n    }\n\n    public static joinEagerRelations(qb: SelectQueryBuilder<any>, alias: string, metadata: EntityMetadata) {\n        metadata.eagerRelations.forEach(relation => {\n            const relationAlias = alias + \"_\" + relation.propertyPath.replace(\".\", \"_\");\n            qb.leftJoinAndSelect(alias + \".\" + relation.propertyPath, relationAlias);\n            this.joinEagerRelations(qb, relationAlias, relation.inverseEntityMetadata);\n        });\n    }\n\n}\n"],"sourceRoot":".."}