{"version":3,"sources":["../browser/src/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.ts"],"names":[],"mappings":"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","file":"PlainObjectToDatabaseEntityTransformer.js","sourcesContent":["import {ObjectLiteral} from \"../../common/ObjectLiteral\";\nimport {EntityMetadata} from \"../../metadata/EntityMetadata\";\nimport {EntityManager} from \"../../entity-manager/EntityManager\";\nimport {RelationMetadata} from \"../../metadata/RelationMetadata\";\n\n/**\n */\nclass LoadMapItem {\n\n entity?: ObjectLiteral;\n plainEntity: ObjectLiteral;\n metadata: EntityMetadata;\n parentLoadMapItem?: LoadMapItem;\n relation?: RelationMetadata;\n\n constructor(plainEntity: ObjectLiteral,\n metadata: EntityMetadata,\n parentLoadMapItem?: LoadMapItem,\n relation?: RelationMetadata) {\n this.plainEntity = plainEntity;\n this.metadata = metadata;\n this.parentLoadMapItem = parentLoadMapItem;\n this.relation = relation;\n }\n\n get target(): Function|string {\n return this.metadata.target;\n }\n\n get id(): any {\n return this.metadata.getEntityIdMixedMap(this.plainEntity);\n }\n\n}\n\nclass LoadMap {\n\n loadMapItems: LoadMapItem[] = [];\n\n get mainLoadMapItem(): LoadMapItem|undefined {\n return this.loadMapItems.find(item => !item.relation && !item.parentLoadMapItem);\n }\n\n addLoadMap(newLoadMap: LoadMapItem) {\n const item = this.loadMapItems.find(item => item.target === newLoadMap.target && item.id === newLoadMap.id);\n if (!item)\n this.loadMapItems.push(newLoadMap);\n }\n\n fillEntities(target: Function|string, entities: any[]) {\n entities.forEach(entity => {\n const item = this.loadMapItems.find(loadMapItem => {\n return loadMapItem.target === target && loadMapItem.metadata.compareEntities(entity, loadMapItem.plainEntity);\n });\n if (item)\n item.entity = entity;\n });\n }\n\n groupByTargetIds(): { target: Function|string, ids: any[] }[] {\n const groups: { target: Function|string, ids: any[] }[] = [];\n this.loadMapItems.forEach(loadMapItem => {\n let group = groups.find(group => group.target === loadMapItem.target);\n if (!group) {\n group = { target: loadMapItem.target, ids: [] };\n groups.push(group);\n }\n\n group.ids.push(loadMapItem.id);\n });\n return groups;\n }\n\n}\n\n/**\n * Transforms plain old javascript object\n * Entity is constructed based on its entity metadata.\n */\nexport class PlainObjectToDatabaseEntityTransformer {\n\n constructor(private manager: EntityManager) {\n }\n\n // -------------------------------------------------------------------------\n // Public Methods\n // -------------------------------------------------------------------------\n\n async transform(plainObject: ObjectLiteral, metadata: EntityMetadata): Promise<ObjectLiteral|undefined> {\n\n // if plain object does not have id then nothing to load really\n if (!metadata.hasAllPrimaryKeys(plainObject))\n return Promise.reject(\"Given object does not have a primary column, cannot transform it to database entity.\");\n\n // create a special load map that will hold all metadata that will be used to operate with entities easily\n const loadMap = new LoadMap();\n const fillLoadMap = (entity: ObjectLiteral, entityMetadata: EntityMetadata, parentLoadMapItem?: LoadMapItem, relation?: RelationMetadata) => {\n const item = new LoadMapItem(entity, entityMetadata, parentLoadMapItem, relation);\n loadMap.addLoadMap(item);\n\n entityMetadata\n .extractRelationValuesFromEntity(entity, metadata.relations)\n .filter(value => value !== null && value !== undefined)\n .forEach(([relation, value, inverseEntityMetadata]) => fillLoadMap(value, inverseEntityMetadata, item, relation));\n };\n fillLoadMap(plainObject, metadata);\n // load all entities and store them in the load map\n await Promise.all(loadMap.groupByTargetIds().map(targetWithIds => { // todo: fix type hinting\n return this.manager\n .findByIds<ObjectLiteral>(targetWithIds.target as any, targetWithIds.ids)\n .then(entities => loadMap.fillEntities(targetWithIds.target, entities));\n }));\n\n // go through each item in the load map and set their entity relationship using metadata stored in load map\n loadMap.loadMapItems.forEach(loadMapItem => {\n if (!loadMapItem.relation ||\n !loadMapItem.entity ||\n !loadMapItem.parentLoadMapItem ||\n !loadMapItem.parentLoadMapItem.entity)\n return;\n\n if (loadMapItem.relation.isManyToMany || loadMapItem.relation.isOneToMany) {\n if (!loadMapItem.parentLoadMapItem.entity[loadMapItem.relation.propertyName])\n loadMapItem.parentLoadMapItem.entity[loadMapItem.relation.propertyName] = [];\n loadMapItem.parentLoadMapItem.entity[loadMapItem.relation.propertyName].push(loadMapItem.entity);\n\n } else {\n loadMapItem.parentLoadMapItem.entity[loadMapItem.relation.propertyName] = loadMapItem.entity;\n }\n });\n\n return loadMap.mainLoadMapItem ? loadMap.mainLoadMapItem.entity : undefined;\n }\n\n}"],"sourceRoot":"../.."}
|