333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
{"version":3,"sources":["../../src/query-builder/JoinAttribute.ts"],"names":[],"mappings":"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","file":"JoinAttribute.js","sourcesContent":["import {EntityMetadata} from \"../metadata/EntityMetadata\";\nimport {Connection} from \"../connection/Connection\";\nimport {RelationMetadata} from \"../metadata/RelationMetadata\";\nimport {QueryBuilderUtils} from \"./QueryBuilderUtils\";\nimport {QueryExpressionMap} from \"./QueryExpressionMap\";\nimport {Alias} from \"./Alias\";\nimport {ObjectUtils} from \"../util/ObjectUtils\";\n\n/**\n * Stores all join attributes which will be used to build a JOIN query.\n */\nexport class JoinAttribute {\n\n    // -------------------------------------------------------------------------\n    // Public Properties\n    // -------------------------------------------------------------------------\n\n    /**\n     * Join direction.\n     */\n    direction: \"LEFT\"|\"INNER\";\n\n    /**\n     * Alias of the joined (destination) table.\n     */\n    alias: Alias;\n\n    /**\n     * Joined table, entity target, or relation in \"post.category\" format.\n     */\n    entityOrProperty: Function|string;\n\n    /**\n     * Extra condition applied to \"ON\" section of join.\n     */\n    condition?: string;\n\n    /**\n     * Property + alias of the object where to joined data should be mapped.\n     */\n    mapToProperty?: string;\n\n    /**\n     * Indicates if user maps one or many objects from the join.\n     */\n    isMappingMany?: boolean;\n\n    // -------------------------------------------------------------------------\n    // Constructor\n    // -------------------------------------------------------------------------\n\n    constructor(private connection: Connection,\n                private queryExpressionMap: QueryExpressionMap,\n                joinAttribute?: JoinAttribute) {\n        ObjectUtils.assign(this, joinAttribute || {});\n    }\n\n    // -------------------------------------------------------------------------\n    // Public Methods\n    // -------------------------------------------------------------------------\n\n    get isMany(): boolean {\n        if (this.isMappingMany !== undefined)\n            return this.isMappingMany;\n\n        if (this.relation)\n            return this.relation.isManyToMany || this.relation.isOneToMany;\n\n        return false;\n    }\n\n    \n    isSelectedCache: boolean;\n    isSelectedEvalueated: boolean = false;\n    /**\n     * Indicates if this join is selected.\n     */\n    get isSelected(): boolean {\n        if (!this.isSelectedEvalueated) {\n            let getValue = () => {\n                for (const select of this.queryExpressionMap.selects) {\n                    if (select.selection === this.alias.name)\n                        return true;\n\n                    if (this.metadata && !!this.metadata.columns.find(column => select.selection === this.alias.name + \".\" + column.propertyPath))\n                        return true;\n                }\n\n                return false;\n            };\n            this.isSelectedCache = getValue();\n            this.isSelectedEvalueated = true;\n        }\n        return this.isSelectedCache;\n\n    }\n\n    /**\n     * Name of the table which we should join.\n     */\n    get tablePath(): string {\n        return this.metadata ? this.metadata.tablePath : this.entityOrProperty as string;\n    }\n\n    /**\n     * Alias of the parent of this join.\n     * For example, if we join (\"post.category\", \"categoryAlias\") then \"post\" is a parent alias.\n     * This value is extracted from entityOrProperty value.\n     * This is available when join was made using \"post.category\" syntax.\n     */\n    get parentAlias(): string|undefined {\n        if (!QueryBuilderUtils.isAliasProperty(this.entityOrProperty))\n            return undefined;\n\n        return this.entityOrProperty.substr(0, this.entityOrProperty.indexOf(\".\"));\n    }\n\n    /**\n     * Relation property name of the parent.\n     * This is used to understand what is joined.\n     * For example, if we join (\"post.category\", \"categoryAlias\") then \"category\" is a relation property.\n     * This value is extracted from entityOrProperty value.\n     * This is available when join was made using \"post.category\" syntax.\n     */\n    get relationPropertyPath(): string|undefined {\n        if (!QueryBuilderUtils.isAliasProperty(this.entityOrProperty))\n            return undefined;\n\n        return this.entityOrProperty.substr(this.entityOrProperty.indexOf(\".\") + 1);\n    }\n\n    relationCache: RelationMetadata|undefined;\n    relationEvalueated: boolean = false;\n    /**\n     * Relation of the parent.\n     * This is used to understand what is joined.\n     * This is available when join was made using \"post.category\" syntax.\n     * Relation can be undefined if entityOrProperty is regular entity or custom table.\n     */\n    get relation(): RelationMetadata | undefined {\n        if (!this.relationEvalueated) {\n            let getValue = () => {\n                if (!QueryBuilderUtils.isAliasProperty(this.entityOrProperty))\n                    return undefined;\n\n                const relationOwnerSelection = this.queryExpressionMap.findAliasByName(this.parentAlias!);\n                let relation = relationOwnerSelection.metadata.findRelationWithPropertyPath(this.relationPropertyPath!);\n\n                if (relation) {\n                    return relation;\n                }\n\n                if (relationOwnerSelection.metadata.parentEntityMetadata) {\n                    relation = relationOwnerSelection.metadata.parentEntityMetadata.findRelationWithPropertyPath(this.relationPropertyPath!);\n                    if (relation) {\n                        return relation;\n                    }\n                }\n\n                throw new Error(`Relation with property path ${this.relationPropertyPath} in entity was not found.`);\n            };\n            this.relationCache = getValue.bind(this)();\n            this.relationEvalueated = true;\n        }\n        return this.relationCache;\n    }\n\n    /**\n     * Metadata of the joined entity.\n     * If table without entity was joined, then it will return undefined.\n     */\n    get metadata(): EntityMetadata|undefined {\n\n        // entityOrProperty is relation, e.g. \"post.category\"\n        if (this.relation)\n            return this.relation.inverseEntityMetadata;\n\n        // entityOrProperty is Entity class\n        if (this.connection.hasMetadata(this.entityOrProperty))\n            return this.connection.getMetadata(this.entityOrProperty);\n\n        return undefined;\n\n        /*if (typeof this.entityOrProperty === \"string\") { // entityOrProperty is a custom table\n\n            // first try to find entity with such name, this is needed when entity does not have a target class,\n            // and its target is a string name (scenario when plain old javascript is used or entity schema is loaded from files)\n            const metadata = this.connection.entityMetadatas.find(metadata => metadata.name === this.entityOrProperty);\n            if (metadata)\n                return metadata;\n\n            // check if we have entity with such table name, and use its metadata if found\n            return this.connection.entityMetadatas.find(metadata => metadata.tableName === this.entityOrProperty);\n        }*/\n    }\n\n    /**\n     * Generates alias of junction table, whose ids we get.\n     */\n    get junctionAlias(): string {\n        if (!this.relation)\n            throw new Error(`Cannot get junction table for join without relation.`);\n\n        return this.relation.isOwning ? this.parentAlias + \"_\" + this.alias.name : this.alias.name + \"_\" + this.parentAlias;\n    }\n\n    get mapToPropertyParentAlias(): string|undefined {\n        if (!this.mapToProperty)\n            return undefined;\n\n        return this.mapToProperty!.split(\".\")[0];\n    }\n\n    get mapToPropertyPropertyName(): string|undefined {\n        if (!this.mapToProperty)\n            return undefined;\n\n        return this.mapToProperty!.split(\".\")[1];\n    }\n\n}"],"sourceRoot":".."}