333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
{"version":3,"sources":["../browser/src/metadata/IndexMetadata.ts"],"names":[],"mappings":"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","file":"IndexMetadata.js","sourcesContent":["import {EntityMetadata} from \"./EntityMetadata\";\nimport {IndexMetadataArgs} from \"../metadata-args/IndexMetadataArgs\";\nimport {NamingStrategyInterface} from \"../naming-strategy/NamingStrategyInterface\";\nimport {ColumnMetadata} from \"./ColumnMetadata\";\nimport {EmbeddedMetadata} from \"./EmbeddedMetadata\";\n\n/**\n * Index metadata contains all information about table's index.\n */\nexport class IndexMetadata {\n\n    // ---------------------------------------------------------------------\n    // Public Properties\n    // ---------------------------------------------------------------------\n\n    /**\n     * Entity metadata of the class to which this index is applied.\n     */\n    entityMetadata: EntityMetadata;\n\n    /**\n     * Embedded metadata if this index was applied on embedded.\n     */\n    embeddedMetadata?: EmbeddedMetadata;\n\n    /**\n     * Indicates if this index must be unique.\n     */\n    isUnique: boolean = false;\n\n    /**\n     * The SPATIAL modifier indexes the entire column and does not allow indexed columns to contain NULL values.\n     * Works only in MySQL.\n     */\n    isSpatial: boolean = false;\n\n    /**\n     * The FULLTEXT modifier indexes the entire column and does not allow prefixing.\n     * Works only in MySQL.\n     */\n    isFulltext: boolean = false;\n\n    /**\n     * Indicates if this index must synchronize with database index.\n     */\n    synchronize: boolean = true;\n\n    /**\n     * If true, the index only references documents with the specified field.\n     * These indexes use less space but behave differently in some situations (particularly sorts).\n     * This option is only supported for mongodb database.\n     */\n    isSparse?: boolean;\n\n    /**\n     * Builds the index in the background so that building an index an does not block other database activities.\n     * This option is only supported for mongodb database.\n     */\n    isBackground?: boolean;\n\n    /**\n     * Specifies a time to live, in seconds.\n     * This option is only supported for mongodb database.\n     */\n    expireAfterSeconds?: number;\n\n    /**\n     * Target class to which metadata is applied.\n     */\n    target?: Function|string;\n\n    /**\n     * Indexed columns.\n     */\n    columns: ColumnMetadata[] = [];\n\n    /**\n     * User specified index 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 index name.\n     * If index name was given by a user then it stores normalized (by naming strategy) givenName.\n     * If index name was not given then its generated.\n     */\n    name: string;\n\n    /**\n     * Index filter condition.\n     */\n    where?: 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?: IndexMetadataArgs\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            if (options.args.synchronize !== null && options.args.synchronize !== undefined)\n                this.synchronize = options.args.synchronize;\n            this.isUnique = !!options.args.unique;\n            this.isSpatial = !!options.args.spatial;\n            this.isFulltext = !!options.args.fulltext;\n            this.where = options.args.where;\n            this.isSparse = options.args.sparse;\n            this.isBackground = options.args.background;\n            this.expireAfterSeconds = options.args.expireAfterSeconds;\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 index properties.\n     * Must be called after all entity metadata's properties map, columns and relations are built.\n     */\n    build(namingStrategy: NamingStrategyInterface): this {\n        if (this.synchronize === false) {\n            this.name = this.givenName!;\n            return this;\n        }\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 { // todo: indices in embeds are not implemented in this syntax. deprecate this syntax?\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(propertyPath => {\n                const columnWithSameName = this.entityMetadata.columns.find(column => column.propertyPath === propertyPath);\n                if (columnWithSameName) {\n                    return [columnWithSameName];\n                }\n                const relationWithSameName = this.entityMetadata.relations.find(relation => relation.isWithJoinColumn && relation.propertyName === propertyPath);\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(`Index ${indexName}contains column that is missing in the entity (${entityName}): ` + propertyPath);\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.indexName(this.entityMetadata.tablePath, this.columns.map(column => column.databaseName), this.where);\n        return this;\n    }\n\n}\n"],"sourceRoot":".."}