def RegenerateSearchableSubtagMap(self, file_service_id, tag_service_id, status_hook=None): subtags_fts4_table_name = self.GetSubtagsFTS4TableName( file_service_id, tag_service_id) subtags_searchable_map_table_name = self.GetSubtagsSearchableMapTableName( file_service_id, tag_service_id) self._Execute( 'DELETE FROM {};'.format(subtags_searchable_map_table_name)) query = 'SELECT docid FROM {};'.format(subtags_fts4_table_name) BLOCK_SIZE = 10000 for (group_of_subtag_ids, num_done, num_to_do) in HydrusDB.ReadLargeIdQueryInSeparateChunks( self._c, query, BLOCK_SIZE): for subtag_id in group_of_subtag_ids: result = self._Execute( 'SELECT subtag FROM subtags WHERE subtag_id = ?;', (subtag_id, )).fetchone() if result is None: continue (subtag, ) = result searchable_subtag = ClientSearch.ConvertSubtagToSearchable( subtag) if searchable_subtag != subtag: searchable_subtag_id = self.modules_tags.GetSubtagId( searchable_subtag) self._Execute( 'INSERT OR IGNORE INTO {} ( subtag_id, searchable_subtag_id ) VALUES ( ?, ? );' .format(subtags_searchable_map_table_name), (subtag_id, searchable_subtag_id)) message = HydrusData.ConvertValueRangeToPrettyString( num_done, num_to_do) HG.client_controller.frame_splash_status.SetSubtext(message) if status_hook is not None: status_hook(message)
def Repopulate(self): self.ClearCache() tag_service_ids = self.modules_services.GetServiceIds( HC.REAL_TAG_SERVICES) queries = [ self.modules_mappings_counts.GetQueryPhraseForCurrentTagIds( ClientTags.TAG_DISPLAY_STORAGE, self.modules_services.combined_local_file_service_id, tag_service_id) for tag_service_id in tag_service_ids ] full_query = '{};'.format(' UNION '.join(queries)) for (block_of_tag_ids, num_done, num_to_do) in HydrusDB.ReadLargeIdQueryInSeparateChunks( self._c, full_query, 1024): self.AddTagIdsToCache(block_of_tag_ids)
def Generate(self, tag_service_id): self.modules_mappings_counts.CreateTables( ClientTags.TAG_DISPLAY_STORAGE, self.modules_services.combined_file_service_id, tag_service_id) # (current_mappings_table_name, deleted_mappings_table_name, pending_mappings_table_name, petitioned_mappings_table_name ) = ClientDBMappingsStorage.GenerateMappingsTableNames(tag_service_id) current_mappings_exist = self._Execute( 'SELECT 1 FROM ' + current_mappings_table_name + ' LIMIT 1;').fetchone() is not None pending_mappings_exist = self._Execute( 'SELECT 1 FROM ' + pending_mappings_table_name + ' LIMIT 1;').fetchone() is not None if current_mappings_exist or pending_mappings_exist: # not worth iterating through all known tags for an empty service for (group_of_ids, num_done, num_to_do) in HydrusDB.ReadLargeIdQueryInSeparateChunks( self._c, 'SELECT tag_id FROM tags;', 10000): # must be a cleverer way of doing this with self._MakeTemporaryIntegerTable( group_of_ids, 'tag_id') as temp_table_name: current_counter = collections.Counter() # temp tags to mappings for (tag_id, count) in self._Execute( 'SELECT tag_id, COUNT( * ) FROM {} CROSS JOIN {} USING ( tag_id ) GROUP BY ( tag_id );' .format(temp_table_name, current_mappings_table_name)): current_counter[tag_id] = count pending_counter = collections.Counter() # temp tags to mappings for (tag_id, count) in self._Execute( 'SELECT tag_id, COUNT( * ) FROM {} CROSS JOIN {} USING ( tag_id ) GROUP BY ( tag_id );' .format(temp_table_name, pending_mappings_table_name)): pending_counter[tag_id] = count all_ids_seen = set(current_counter.keys()) all_ids_seen.update(pending_counter.keys()) counts_cache_changes = [(tag_id, current_counter[tag_id], pending_counter[tag_id]) for tag_id in all_ids_seen] if len(counts_cache_changes) > 0: self.modules_mappings_counts_update.AddCounts( ClientTags.TAG_DISPLAY_STORAGE, self.modules_services.combined_file_service_id, tag_service_id, counts_cache_changes) self.modules_mappings_cache_combined_files_display.Generate( tag_service_id)