From ee04923ce1c8dde73df1afa2ea9e32bea89a4124 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 27 Sep 2022 16:16:36 +0300 Subject: [PATCH] Add lazy initialization for keyword_stickers_map_. --- td/telegram/StickersManager.cpp | 13 +++++++++++++ td/telegram/StickersManager.h | 3 +++ td/telegram/StickersManager.hpp | 1 + tdutils/td/utils/Hints.cpp | 3 +++ tdutils/td/utils/Hints.h | 4 ++-- 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 2d913b90f..57c855a67 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -3703,6 +3703,7 @@ StickerSetId StickersManager::on_get_messages_sticker_set(StickerSetId sticker_s if (!is_bot) { s->emoji_stickers_map_.clear(); s->sticker_emojis_map_.clear(); + s->keyword_stickers_map_.clear(); s->sticker_keywords_map_.clear(); for (auto &pack : set->packs_) { auto cleaned_emoji = remove_emoji_modifiers(pack->emoticon_); @@ -4185,6 +4186,18 @@ void StickersManager::on_get_installed_sticker_sets_failed(StickerType sticker_t fail_promises(load_installed_sticker_sets_queries_[type], std::move(error)); } +const std::map> &StickersManager::get_sticker_set_keywords(StickerSet *sticker_set) { + if (sticker_set->keyword_stickers_map_.empty()) { + for (auto &sticker_id_keywords : sticker_set->sticker_keywords_map_) { + for (auto &keyword : Hints::fix_words(transform(sticker_id_keywords.second, utf8_prepare_search_string))) { + CHECK(!keyword.empty()); + sticker_set->keyword_stickers_map_[keyword].push_back(sticker_id_keywords.first); + } + } + } + return sticker_set->keyword_stickers_map_; +} + std::pair, vector> StickersManager::split_stickers_by_premium( const vector &sticker_ids) const { CHECK(!td_->auth_manager_->is_bot()); diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index 6fea91626..7bff0915d 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -458,6 +458,7 @@ class StickersManager final : public Actor { vector premium_sticker_positions_; FlatHashMap> emoji_stickers_map_; // emoji -> stickers FlatHashMap, FileIdHash> sticker_emojis_map_; // sticker -> emojis + std::map> keyword_stickers_map_; // keyword -> stickers FlatHashMap, FileIdHash> sticker_keywords_map_; // sticker -> keywords bool is_installed_ = false; @@ -899,6 +900,8 @@ class StickersManager final : public Actor { vector &&document_ids, Promise> &&promise); + static const std::map> &get_sticker_set_keywords(StickerSet *sticker_set); + static string get_emoji_language_code_version_database_key(const string &language_code); static string get_emoji_language_code_last_difference_time_database_key(const string &language_code); diff --git a/td/telegram/StickersManager.hpp b/td/telegram/StickersManager.hpp index d7647e0de..b9d17b676 100644 --- a/td/telegram/StickersManager.hpp +++ b/td/telegram/StickersManager.hpp @@ -377,6 +377,7 @@ void StickersManager::parse_sticker_set(StickerSet *sticker_set, ParserT &parser if (sticker_set->was_loaded_) { sticker_set->emoji_stickers_map_.clear(); sticker_set->sticker_emojis_map_.clear(); + sticker_set->keyword_stickers_map_.clear(); sticker_set->sticker_keywords_map_.clear(); } for (uint32 i = 0; i < stored_sticker_count; i++) { diff --git a/tdutils/td/utils/Hints.cpp b/tdutils/td/utils/Hints.cpp index a7870527a..f692cb747 100644 --- a/tdutils/td/utils/Hints.cpp +++ b/tdutils/td/utils/Hints.cpp @@ -30,6 +30,9 @@ vector Hints::fix_words(vector words) { new_words_size++; } } + if (new_words_size == 1 && words[0].empty()) { + new_words_size = 0; + } words.resize(new_words_size); return words; } diff --git a/tdutils/td/utils/Hints.h b/tdutils/td/utils/Hints.h index f59e45f50..3e419c079 100644 --- a/tdutils/td/utils/Hints.h +++ b/tdutils/td/utils/Hints.h @@ -41,6 +41,8 @@ class Hints { size_t size() const; + static vector fix_words(vector words); + private: std::map> word_to_keys_; std::map> translit_word_to_keys_; @@ -50,8 +52,6 @@ class Hints { static void add_word(const string &word, KeyT key, std::map> &word_to_keys); static void delete_word(const string &word, KeyT key, std::map> &word_to_keys); - static vector fix_words(vector words); - static vector get_words(Slice name); static void add_search_results(vector &results, const string &word,