Optimize PDB.get_root_albums and get_root_tags.
Achieves in a single query what used to require a ton of individual get_parent calls.
This commit is contained in:
		
							parent
							
								
									8c356df6fd
								
							
						
					
					
						commit
						1626a6fa11
					
				
					 1 changed files with 26 additions and 7 deletions
				
			
		|  | @ -70,9 +70,10 @@ class PDBAlbumMixin: | |||
|         return self.get_things_by_id('album', ids) | ||||
| 
 | ||||
|     def get_root_albums(self): | ||||
|         for album in self.get_albums(): | ||||
|             if album.get_parent() is None: | ||||
|                 yield album | ||||
|         ''' | ||||
|         Yield Albums that have no parent. | ||||
|         ''' | ||||
|         yield from self.get_root_things('album') | ||||
| 
 | ||||
|     @decorators.required_feature('album.new') | ||||
|     @decorators.transaction | ||||
|  | @ -856,11 +857,9 @@ class PDBTagMixin: | |||
| 
 | ||||
|     def get_root_tags(self): | ||||
|         ''' | ||||
|         Yield all Tags that have no parent. | ||||
|         Yield Tags that have no parent. | ||||
|         ''' | ||||
|         for tag in self.get_tags(): | ||||
|             if tag.get_parent() is None: | ||||
|                 yield tag | ||||
|         yield from self.get_root_things('tag') | ||||
| 
 | ||||
|     @decorators.required_feature('tag.new') | ||||
|     @decorators.transaction | ||||
|  | @ -1417,6 +1416,26 @@ class PhotoDB( | |||
|             self._cached_qualname_map = tag_export.qualified_names(self.get_tags()) | ||||
|         return self._cached_qualname_map | ||||
| 
 | ||||
|     def get_root_things(self, thing_type): | ||||
|         thing_map = _THING_CLASSES[thing_type] | ||||
| 
 | ||||
|         thing_class = thing_map['class'] | ||||
|         table = thing_map['table'] | ||||
|         group_table = thing_class.group_table | ||||
| 
 | ||||
|         query = ''' | ||||
|         SELECT * FROM {table} | ||||
|         WHERE NOT EXISTS ( | ||||
|             SELECT 1 FROM {group_table} | ||||
|             WHERE memberid == {table}.id | ||||
|         ) | ||||
|         '''.format(table=table, group_table=group_table) | ||||
| 
 | ||||
|         rows = self.sql_select(query) | ||||
|         for row in rows: | ||||
|             thing = thing_class(self, row) | ||||
|             yield thing | ||||
| 
 | ||||
|     def get_thing_by_id(self, thing_type, thing_id): | ||||
|         thing_map = _THING_CLASSES[thing_type] | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue