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) |         return self.get_things_by_id('album', ids) | ||||||
| 
 | 
 | ||||||
|     def get_root_albums(self): |     def get_root_albums(self): | ||||||
|         for album in self.get_albums(): |         ''' | ||||||
|             if album.get_parent() is None: |         Yield Albums that have no parent. | ||||||
|                 yield album |         ''' | ||||||
|  |         yield from self.get_root_things('album') | ||||||
| 
 | 
 | ||||||
|     @decorators.required_feature('album.new') |     @decorators.required_feature('album.new') | ||||||
|     @decorators.transaction |     @decorators.transaction | ||||||
|  | @ -856,11 +857,9 @@ class PDBTagMixin: | ||||||
| 
 | 
 | ||||||
|     def get_root_tags(self): |     def get_root_tags(self): | ||||||
|         ''' |         ''' | ||||||
|         Yield all Tags that have no parent. |         Yield Tags that have no parent. | ||||||
|         ''' |         ''' | ||||||
|         for tag in self.get_tags(): |         yield from self.get_root_things('tag') | ||||||
|             if tag.get_parent() is None: |  | ||||||
|                 yield tag |  | ||||||
| 
 | 
 | ||||||
|     @decorators.required_feature('tag.new') |     @decorators.required_feature('tag.new') | ||||||
|     @decorators.transaction |     @decorators.transaction | ||||||
|  | @ -1417,6 +1416,26 @@ class PhotoDB( | ||||||
|             self._cached_qualname_map = tag_export.qualified_names(self.get_tags()) |             self._cached_qualname_map = tag_export.qualified_names(self.get_tags()) | ||||||
|         return self._cached_qualname_map |         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): |     def get_thing_by_id(self, thing_type, thing_id): | ||||||
|         thing_map = _THING_CLASSES[thing_type] |         thing_map = _THING_CLASSES[thing_type] | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue