| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROMEOS_ASH_COMPONENTS_FILE_MANAGER_INDEXING_RAM_STORAGE_H_ |
| #define CHROMEOS_ASH_COMPONENTS_FILE_MANAGER_INDEXING_RAM_STORAGE_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <optional> |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include "base/component_export.h" |
| #include "chromeos/ash/components/file_manager/indexing/file_info.h" |
| #include "chromeos/ash/components/file_manager/indexing/index_storage.h" |
| #include "chromeos/ash/components/file_manager/indexing/query.h" |
| #include "chromeos/ash/components/file_manager/indexing/term.h" |
| #include "url/gurl.h" |
| |
| namespace ash::file_manager { |
| |
| // An in-memory implementation of the file index. Nothing is persisted. All data |
| // is kept in various maps. |
| class COMPONENT_EXPORT(FILE_MANAGER) RamStorage : public IndexStorage { |
| public: |
| RamStorage(); |
| ~RamStorage() override; |
| |
| RamStorage(const RamStorage&) = delete; |
| RamStorage& operator=(const RamStorage&) = delete; |
| |
| // RAM implementation of IndexStorage methods. |
| |
| // Inverted index and plain index functions. |
| const std::set<int64_t> GetUrlIdsForTermId(int64_t term_id) const override; |
| const std::set<int64_t> GetTermIdsForUrl(int64_t url_id) const override; |
| |
| // Posting list support. |
| size_t AddToPostingList(int64_t term_id, int64_t url_id) override; |
| size_t DeleteFromPostingList(int64_t term_id, int64_t url_id) override; |
| |
| // Term ID management. |
| int64_t GetTermId(const Term& term) const override; |
| int64_t GetOrCreateTermId(const Term& term) override; |
| |
| // Token ID management. |
| int64_t GetTokenId(const std::string& token_bytes) const override; |
| int64_t GetOrCreateTokenId(const std::string& token0_bytes) override; |
| |
| // URL ID management. |
| int64_t GetUrlId(const GURL& url) const override; |
| int64_t GetOrCreateUrlId(const GURL& url) override; |
| int64_t MoveUrl(const GURL& from, const GURL& to) override; |
| int64_t DeleteUrl(const GURL& url) override; |
| |
| // FileInfo management. |
| int64_t PutFileInfo(const FileInfo& file_info) override; |
| std::optional<FileInfo> GetFileInfo(int64_t url_id) const override; |
| int64_t DeleteFileInfo(int64_t url_id) override; |
| |
| // Miscellaneous. |
| size_t AddTermIdsForUrl(const std::set<int64_t>& term_ids, |
| int64_t url_id) override; |
| size_t DeleteTermIdsForUrl(const std::set<int64_t>& term_ids, |
| int64_t url_id) override; |
| |
| private: |
| // Adds to the inverted posting lists the specified `term_id`. This may be |
| // a no-op if the given term has previously been associated with the file |
| // info ID. |
| void AddToPlainIndex(int64_t url_id, int64_t term_id); |
| |
| // Removes the given `term_id` from the inverted posting lists of the |
| // specified `url_id`. This may be a no-op if the term_id is not present |
| // on the term list for the given `url_id`. |
| void DeleteFromPlainIndex(int64_t url_id, int64_t term_id); |
| |
| // Maps from stringified tokens to a unique ID. |
| std::map<std::string, int64_t> token_map_; |
| int64_t token_id_ = 0; |
| |
| // Maps field and token ID to a single term ID. It uses token_id rather than |
| // token value to minimize memory usage. |
| std::map<std::tuple<std::string, int64_t>, int64_t> term_map_; |
| int64_t term_id_ = 0; |
| |
| // Maps a file URL to a unique ID. The GURL is the data uniquely identifying |
| // a file. Hence we use the GURL rather than the whole FileInfo. For example, |
| // if the size of the file changes, it does not have consequences on this |
| // index. |
| std::map<GURL, int64_t> url_to_id_; |
| int64_t url_id_ = 0; |
| |
| // Maps url_id to the corresponding FileInfo. |
| std::map<int64_t, FileInfo> url_id_to_file_info_; |
| |
| // A posting list, which is a map from an term ID to a set of all |
| // URL IDs that represent files that has this term ID associated with them. |
| std::map<int64_t, std::set<int64_t>> posting_lists_; |
| |
| // A map from URL ID to term IDs that are stored for a given file. |
| // This works like a plain index (mapping from URL ID to all terms known |
| // for that URL ID). |
| std::map<int64_t, std::set<int64_t>> plain_index_; |
| |
| // A pre-allocated empty ID set, returned when we have no ID set available. |
| const std::set<int64_t> empty_id_set_; |
| }; |
| |
| } // namespace ash::file_manager |
| |
| #endif // CHROMEOS_ASH_COMPONENTS_FILE_MANAGER_INDEXING_RAM_STORAGE_H_ |