chore(database): append inherit inspect attribute with eager load (#2010)
This commit is contained in:
		
							parent
							
								
									24601aa66f
								
							
						
					
					
						commit
						b401c54442
					
				| @ -16,6 +16,51 @@ pgOnly()('collection inherits', () => { | |||||||
|     await db.close(); |     await db.close(); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|  |   it('should append __collection with eager load', async () => { | ||||||
|  |     const Root = db.collection({ | ||||||
|  |       name: 'root', | ||||||
|  |       fields: [ | ||||||
|  |         { name: 'name', type: 'string' }, | ||||||
|  |         { | ||||||
|  |           name: 'bs', | ||||||
|  |           type: 'hasMany', | ||||||
|  |           target: 'b', | ||||||
|  |           foreignKey: 'root_id', | ||||||
|  |         }, | ||||||
|  |       ], | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     const Child = db.collection({ | ||||||
|  |       name: 'child', | ||||||
|  |       inherits: ['root'], | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     const B = db.collection({ | ||||||
|  |       name: 'b', | ||||||
|  |       fields: [{ name: 'name', type: 'string' }], | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     await db.sync(); | ||||||
|  | 
 | ||||||
|  |     await Child.repository.create({ | ||||||
|  |       values: { | ||||||
|  |         name: 'child1', | ||||||
|  |         bs: [ | ||||||
|  |           { | ||||||
|  |             name: 'b1', | ||||||
|  |           }, | ||||||
|  |         ], | ||||||
|  |       }, | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     const data = await Root.repository.findOne({ | ||||||
|  |       fields: ['bs.name'], | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     expect(data.get('__collection')).toEqual('child'); | ||||||
|  |     expect(data.get('bs')[0].get('name')).toEqual('b1'); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|   it('should not remove parent field reference map after child rewrite field', async () => { |   it('should not remove parent field reference map after child rewrite field', async () => { | ||||||
|     const through = db.collection({ |     const through = db.collection({ | ||||||
|       name: 'through', |       name: 'through', | ||||||
|  | |||||||
| @ -33,7 +33,11 @@ const EagerLoadingNodeProto = { | |||||||
|         }; |         }; | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       OptionsParser.appendInheritInspectAttribute(this.attributes.include, collection); |       OptionsParser.appendInheritInspectAttribute( | ||||||
|  |         lodash.isArray(this.attributes) ? this.attributes : this.attributes.include, | ||||||
|  |         collection, | ||||||
|  |       ); | ||||||
|  | 
 | ||||||
|       this.inspectInheritAttribute = true; |       this.inspectInheritAttribute = true; | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
| @ -346,8 +350,13 @@ export class EagerLoadingTree { | |||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       const nodeChildrenAs = node.children.map((child) => child.association.as); |       const nodeChildrenAs = node.children.map((child) => child.association.as); | ||||||
|  | 
 | ||||||
|       const includeAttributes = [...nodeRawAttributes, ...nodeChildrenAs]; |       const includeAttributes = [...nodeRawAttributes, ...nodeChildrenAs]; | ||||||
| 
 | 
 | ||||||
|  |       if (node.inspectInheritAttribute) { | ||||||
|  |         includeAttributes.push('__schemaName', '__tableName', '__collection'); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|       for (const instance of node.instances) { |       for (const instance of node.instances) { | ||||||
|         const attributes = lodash.pick(instance.dataValues, includeAttributes); |         const attributes = lodash.pick(instance.dataValues, includeAttributes); | ||||||
|         instance.dataValues = attributes; |         instance.dataValues = attributes; | ||||||
|  | |||||||
| @ -2,11 +2,15 @@ export const appendChildCollectionNameAfterRepositoryFind = (db) => { | |||||||
|   return ({ findOptions, dataCollection, data }) => { |   return ({ findOptions, dataCollection, data }) => { | ||||||
|     if (dataCollection.isParent()) { |     if (dataCollection.isParent()) { | ||||||
|       for (const row of data) { |       for (const row of data) { | ||||||
|         const rowCollection = db.tableNameCollectionMap.get( |         if (row.__collection) { | ||||||
|           findOptions.raw |           continue; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         const fullTableName = findOptions.raw | ||||||
|           ? `${row['__schemaName']}.${row['__tableName']}` |           ? `${row['__schemaName']}.${row['__tableName']}` | ||||||
|             : `${row.get('__schemaName')}.${row.get('__tableName')}`, |           : `${row.get('__schemaName')}.${row.get('__tableName')}`; | ||||||
|         ); | 
 | ||||||
|  |         const rowCollection = db.tableNameCollectionMap.get(fullTableName); | ||||||
| 
 | 
 | ||||||
|         if (!rowCollection) { |         if (!rowCollection) { | ||||||
|           db.logger.warn( |           db.logger.warn( | ||||||
|  | |||||||
| @ -36,6 +36,11 @@ export class OptionsParser { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   static appendInheritInspectAttribute(include, collection): any { |   static appendInheritInspectAttribute(include, collection): any { | ||||||
|  |     // if include already has __tableName, __schemaName, skip
 | ||||||
|  |     if (include.find((item) => item?.[1] === '__tableName')) { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     include.push([ |     include.push([ | ||||||
|       Sequelize.literal(`(select relname from pg_class where pg_class.oid = "${collection.name}".tableoid)`), |       Sequelize.literal(`(select relname from pg_class where pg_class.oid = "${collection.name}".tableoid)`), | ||||||
|       '__tableName', |       '__tableName', | ||||||
| @ -147,6 +152,7 @@ export class OptionsParser { | |||||||
| 
 | 
 | ||||||
|     if (this.options?.fields) { |     if (this.options?.fields) { | ||||||
|       attributes = []; |       attributes = []; | ||||||
|  | 
 | ||||||
|       if (this.collection.isParent()) { |       if (this.collection.isParent()) { | ||||||
|         OptionsParser.appendInheritInspectAttribute(attributes, this.collection); |         OptionsParser.appendInheritInspectAttribute(attributes, this.collection); | ||||||
|       } |       } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user