333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
{"version":3,"sources":["../browser/src/metadata/UniqueMetadata.ts"],"names":[],"mappings":"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","file":"UniqueMetadata.js","sourcesContent":["import {EmbeddedMetadata} from \"./EmbeddedMetadata\";\nimport {EntityMetadata} from \"./EntityMetadata\";\nimport {NamingStrategyInterface} from \"../naming-strategy/NamingStrategyInterface\";\nimport {ColumnMetadata} from \"./ColumnMetadata\";\nimport {UniqueMetadataArgs} from \"../metadata-args/UniqueMetadataArgs\";\n\n/**\n * Unique metadata contains all information about table's unique constraints.\n */\nexport class UniqueMetadata {\n\n    // ---------------------------------------------------------------------\n    // Public Properties\n    // ---------------------------------------------------------------------\n\n    /**\n     * Entity metadata of the class to which this unique constraint is applied.\n     */\n    entityMetadata: EntityMetadata;\n\n    /**\n     * Embedded metadata if this unique was applied on embedded.\n     */\n    embeddedMetadata?: EmbeddedMetadata;\n\n    /**\n     * Target class to which metadata is applied.\n     */\n    target?: Function|string;\n\n    /**\n     * Unique columns.\n     */\n    columns: ColumnMetadata[] = [];\n\n    /**\n     * User specified unique constraint name.\n     */\n    givenName?: string;\n\n    /**\n     * User specified column names.\n     */\n    givenColumnNames?: ((object?: any) => (any[]|{ [key: string]: number }))|string[];\n\n    /**\n     * Final unique constraint name.\n     * If unique constraint name was given by a user then it stores normalized (by naming strategy) givenName.\n     * If unique constraint name was not given then its generated.\n     */\n    name: string;\n\n    /**\n     * Map of column names with order set.\n     * Used only by MongoDB driver.\n     */\n    columnNamesWithOrderingMap: { [key: string]: number } = {};\n\n    // ---------------------------------------------------------------------\n    // Constructor\n    // ---------------------------------------------------------------------\n\n    constructor(options: {\n        entityMetadata: EntityMetadata,\n        embeddedMetadata?: EmbeddedMetadata,\n        columns?: ColumnMetadata[],\n        args?: UniqueMetadataArgs\n    }) {\n        this.entityMetadata = options.entityMetadata;\n        this.embeddedMetadata = options.embeddedMetadata;\n        if (options.columns)\n            this.columns = options.columns;\n\n        if (options.args) {\n            this.target = options.args.target;\n            this.givenName = options.args.name;\n            this.givenColumnNames = options.args.columns;\n        }\n    }\n\n    // ---------------------------------------------------------------------\n    // Public Build Methods\n    // ---------------------------------------------------------------------\n\n    /**\n     * Builds some depend unique constraint properties.\n     * Must be called after all entity metadata's properties map, columns and relations are built.\n     */\n    build(namingStrategy: NamingStrategyInterface): this {\n\n        const map: { [key: string]: number } = {};\n\n        // if columns already an array of string then simply return it\n        if (this.givenColumnNames) {\n            let columnPropertyPaths: string[] = [];\n            if (this.givenColumnNames instanceof Array) {\n                columnPropertyPaths = this.givenColumnNames.map(columnName => {\n                    if (this.embeddedMetadata)\n                        return this.embeddedMetadata.propertyPath + \".\" + columnName;\n\n                    return columnName;\n                });\n                columnPropertyPaths.forEach(propertyPath => map[propertyPath] = 1);\n            } else {\n                // if columns is a function that returns array of field names then execute it and get columns names from it\n                const columnsFnResult = this.givenColumnNames(this.entityMetadata.propertiesMap);\n                if (columnsFnResult instanceof Array) {\n                    columnPropertyPaths = columnsFnResult.map((i: any) => String(i));\n                    columnPropertyPaths.forEach(name => map[name] = 1);\n                } else {\n                    columnPropertyPaths = Object.keys(columnsFnResult).map((i: any) => String(i));\n                    Object.keys(columnsFnResult).forEach(columnName => map[columnName] = columnsFnResult[columnName]);\n                }\n            }\n\n            this.columns = columnPropertyPaths.map(propertyName => {\n                const columnWithSameName = this.entityMetadata.columns.find(column => column.propertyPath === propertyName);\n                if (columnWithSameName) {\n                    return [columnWithSameName];\n                }\n                const relationWithSameName = this.entityMetadata.relations.find(relation => relation.isWithJoinColumn && relation.propertyName === propertyName);\n                if (relationWithSameName) {\n                    return relationWithSameName.joinColumns;\n                }\n                const indexName = this.givenName ? \"\\\"\" + this.givenName + \"\\\" \" : \"\";\n                const entityName = this.entityMetadata.targetName;\n                throw new Error(`Unique constraint ${indexName}contains column that is missing in the entity (${entityName}): ` + propertyName);\n            })\n            .reduce((a, b) => a.concat(b));\n        }\n\n        this.columnNamesWithOrderingMap = Object.keys(map).reduce((updatedMap, key) => {\n            const column = this.entityMetadata.columns.find(column => column.propertyPath === key);\n            if (column)\n                updatedMap[column.databasePath] = map[key];\n\n            return updatedMap;\n        }, {} as { [key: string]: number });\n\n        this.name = this.givenName ? this.givenName : namingStrategy.uniqueConstraintName(this.entityMetadata.tablePath, this.columns.map(column => column.databaseName));\n        return this;\n    }\n\n}\n"],"sourceRoot":".."}