def _prepare_folderfilters(folders): content_type_id = ContentType.objects.get_for_model(Task).id # Ignore non-filters and those who already have FolderTask prepared. folders = filter( lambda x: x.cache_tag_ids and x.cache_searchcache_id is None, folders) if not folders: return folder_ids = [x.id for x in folders] FolderTask.objects.filter(folder_id__in=folder_ids).delete() for folder in folders: tag_ids = [int(x) for x in folder.cache_tag_ids.split(',')] folder.cache_searchcache_id = search(tag_ids=tag_ids).id folder.save() # Yes, send signals. query = 'INSERT INTO folder_folder_tasks (folder_id, task_id, position)' \ ' SELECT {}, SCE.object_id, SCE.object_id FROM search_searchcacheelement SCE'\ ' WHERE SCE.content_type_id = {} AND SCE.cache_id = {};'.format( folder.id, content_type_id, folder.cache_searchcache_id ) cursor = connection.cursor() cursor.execute(query) transaction.commit_unless_managed()
def _load_line(self, search_str): # read input file using buffering of 1 line. with open(file=self.search_path, buffering=self.buffer_size) as \ line_to_parse: return [ search(pattern=search_str, searched_line=parsed_line) for parsed_line in line_to_parse.readlines() ]
def _invalidate_on_task_tags_change(sender, old_tag_ids, new_tag_ids, **kwargs): content_type = ContentType.objects.get_for_model(Folder) # TODO: Optimize. Filter only those folders that really need invalidation... search_cache_ids = [] diff = set(old_tag_ids) ^ set(new_tag_ids) for tag in diff: search_cache = search(tag_ids=[tag]) search_cache_ids.append(search_cache.id) folder_ids = SearchCacheElement.objects.filter( cache_id__in=search_cache_ids, content_type=content_type) folder_ids = list(set(folder_ids.values_list('object_id', flat=True))) FolderTask.objects.filter(folder_id__in=folder_ids).delete() invalidate_cache_for_folder_ids(folder_ids)
def search(self, **kwargs): logger.info("Searching for {pattern} in string: {str}".format( pattern=self.search_str, str=self.searched_line)) print( search(pattern=self.search_str, searched_line=self.searched_line).string)
def search_films(request): search_for = request.POST.get('search') films_list = all_films.get_all_film_names() result_list = utils.search(films_list, search_for) return JsonResponse(result_list)