From 20827eb501a01a5273ed1a23ac5ca6036645b7f5 Mon Sep 17 00:00:00 2001 From: vng Date: Mon, 28 Dec 2015 20:34:18 +0300 Subject: [PATCH] [search] Removed rank table force generation. --- defines.hpp | 1 - generator/generator_tool/generator_tool.cpp | 1 + indexer/index.cpp | 8 ---- indexer/index.hpp | 3 -- indexer/mwm_set.hpp | 6 ++- search/search_query.cpp | 29 ++----------- search/search_query.hpp | 6 +-- .../search_tests_support/test_mwm_builder.cpp | 3 +- search/v2/rank_table_cache.cpp | 28 ++++++++----- search/v2/rank_table_cache.hpp | 42 ++++++++++++++----- search/v2/search_query_v2.cpp | 1 + 11 files changed, 63 insertions(+), 65 deletions(-) diff --git a/defines.hpp b/defines.hpp index d12686b903..a7332bf0a8 100644 --- a/defines.hpp +++ b/defines.hpp @@ -24,7 +24,6 @@ #define VERSION_FILE_TAG "version" #define METADATA_FILE_TAG "meta" #define METADATA_INDEX_FILE_TAG "metaidx" -#define COMPRESSED_SEARCH_INDEX_FILE_TAG "csdx" #define FEATURE_OFFSETS_FILE_TAG "offs" #define RANKS_FILE_TAG "ranks" // Temporary addresses section that is used in search index generation. diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index 5da7ee3981..e01fa0ce30 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -203,6 +203,7 @@ int main(int argc, char ** argv) LOG(LCRITICAL, ("Error generating search index.")); LOG(LINFO, ("Generating rank table for", datFile)); + if (!search::RankTableBuilder::CreateIfNotExists(datFile)) LOG(LCRITICAL, ("Error generating rank table.")); } diff --git a/indexer/index.cpp b/indexer/index.cpp index a39138fa44..8ac5b5060a 100644 --- a/indexer/index.cpp +++ b/indexer/index.cpp @@ -65,16 +65,8 @@ unique_ptr Index::CreateInfo(platform::LocalCountryFile const & localFi unique_ptr Index::CreateValue(MwmInfo & info) const { - MwmInfoEx & infoEx = dynamic_cast(info); - // Create a section with rank table if it does not exist. platform::LocalCountryFile const & localFile = info.GetLocalFile(); - if (!infoEx.m_rankTableCtorCalled) - { - infoEx.m_rankTableCtorCalled = true; - search::RankTableBuilder::CreateIfNotExists(localFile); - } - unique_ptr p(new MwmValue(localFile)); p->SetTable(dynamic_cast(info)); ASSERT(p->GetHeader().IsMWMSuitable(), ()); diff --git a/indexer/index.hpp b/indexer/index.hpp index b4e2ecd5d5..872ebae84f 100644 --- a/indexer/index.hpp +++ b/indexer/index.hpp @@ -24,10 +24,7 @@ class MwmInfoEx : public MwmInfo { public: - MwmInfoEx() : m_rankTableCtorCalled(false) {} - unique_ptr m_table; - bool m_rankTableCtorCalled; }; class MwmValue : public MwmSet::MwmValueBase diff --git a/indexer/mwm_set.hpp b/indexer/mwm_set.hpp index a0b3e63057..ddfd882947 100644 --- a/indexer/mwm_set.hpp +++ b/indexer/mwm_set.hpp @@ -125,7 +125,7 @@ public: // Mwm handle, which is used to refer to mwm and prevent it from // deletion when its FileContainer is used. - class MwmHandle final + class MwmHandle { public: MwmHandle(); @@ -145,13 +145,15 @@ public: MwmHandle & operator=(MwmHandle && handle); + protected: + MwmId m_mwmId; + private: friend class MwmSet; MwmHandle(MwmSet & mwmSet, MwmId const & mwmId, unique_ptr && value); MwmSet * m_mwmSet; - MwmId m_mwmId; unique_ptr m_value; DISALLOW_COPY(MwmHandle); diff --git a/search/search_query.cpp b/search/search_query.cpp index a745312521..b37cbdf4de 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -170,43 +170,22 @@ Query::RetrievalCallback::RetrievalCallback(Index & index, Query & query, Viewpo void Query::RetrievalCallback::OnFeaturesRetrieved(MwmSet::MwmId const & id, double scale, coding::CompressedBitVector const & features) { - static DummyRankTable dummyTable; - - auto const * table = LoadTable(id); - if (!table) - { - LOG(LWARNING, ("Can't get rank table for:", id)); - table = &dummyTable; - } + auto const & table = m_rankTable.Get(m_index, id); coding::CompressedBitVectorEnumerator::ForEach( features, [&](uint64_t featureId) { ASSERT_LESS_OR_EQUAL(featureId, numeric_limits::max(), ()); - m_query.AddPreResult1(id, static_cast(featureId), table->Get(featureId), scale, + m_query.AddPreResult1(id, static_cast(featureId), table.Get(featureId), scale, m_viewportId); }); } -void Query::RetrievalCallback::OnMwmProcessed(MwmSet::MwmId const & id) { UnloadTable(id); } - -RankTable const * Query::RetrievalCallback::LoadTable(MwmSet::MwmId const & id) +void Query::RetrievalCallback::OnMwmProcessed(MwmSet::MwmId const & id) { - auto const it = m_rankTables.find(id); - if (it != m_rankTables.end()) - return it->second.get(); - - MwmSet::MwmHandle handle = m_index.GetMwmHandleById(id); - ASSERT(handle.IsAlive(), ("Handle should already be held by a retrieval algorithm.")); - - auto newTable = RankTable::Load(handle.GetValue()->m_cont); - auto const * table = newTable.get(); - m_rankTables[id] = move(newTable); - return table; + m_rankTable.Remove(id); } -void Query::RetrievalCallback::UnloadTable(MwmSet::MwmId const & id) { m_rankTables.erase(id); } - // static size_t const Query::kPreResultsCount; diff --git a/search/search_query.hpp b/search/search_query.hpp index e194a9274d..89232ccd77 100644 --- a/search/search_query.hpp +++ b/search/search_query.hpp @@ -4,6 +4,7 @@ #include "search/retrieval.hpp" #include "search/search_trie.hpp" #include "search/suggest.hpp" +#include "search/v2/rank_table_cache.hpp" #include "indexer/ftypes_matcher.hpp" #include "indexer/index.hpp" @@ -142,14 +143,11 @@ protected: void OnMwmProcessed(MwmSet::MwmId const & id) override; private: - RankTable const * LoadTable(MwmSet::MwmId const & id); - - void UnloadTable(MwmSet::MwmId const & id); Index & m_index; Query & m_query; ViewportID m_viewportId; - map> m_rankTables; + search::v2::RankTableCache m_rankTable; }; friend class impl::FeatureLoader; diff --git a/search/search_tests_support/test_mwm_builder.cpp b/search/search_tests_support/test_mwm_builder.cpp index aa53fca8f9..60af2c4ab3 100644 --- a/search/search_tests_support/test_mwm_builder.cpp +++ b/search/search_tests_support/test_mwm_builder.cpp @@ -10,6 +10,7 @@ #include "indexer/data_header.hpp" #include "indexer/features_offsets_table.hpp" #include "indexer/index_builder.hpp" +#include "indexer/rank_table.hpp" #include "platform/local_country_file.hpp" @@ -36,7 +37,6 @@ TestMwmBuilder::~TestMwmBuilder() if (m_collector) Finish(); CHECK(!m_collector, ("Features weren't dumped on disk.")); - FileWriter::DeleteFileX(m_file.GetPath(MapOptions::Map) + EXTENSION_TMP); } void TestMwmBuilder::Add(TestFeature const & feature) @@ -63,6 +63,7 @@ void TestMwmBuilder::Finish() CHECK(indexer::BuildIndexFromDataFile(path, path), ("Can't build geometry index.")); CHECK(indexer::BuildSearchIndexFromDataFile(path, true /* forceRebuild */), ("Can't build search index.")); + CHECK(search::RankTableBuilder::CreateIfNotExists(path), ()); m_file.SyncWithDisk(); } diff --git a/search/v2/rank_table_cache.cpp b/search/v2/rank_table_cache.cpp index 78827d829a..cfaf1ee62e 100644 --- a/search/v2/rank_table_cache.cpp +++ b/search/v2/rank_table_cache.cpp @@ -2,30 +2,36 @@ #include "search/dummy_rank_table.hpp" -#include "indexer/index.hpp" #include "indexer/rank_table.hpp" namespace search { namespace v2 { -RankTableCache::RankTableCache() {} -RankTableCache::~RankTableCache() {} - -RankTable const & RankTableCache::Get(MwmValue & value, MwmSet::MwmId const & mwmId) +RankTable const & RankTableCache::Get(Index & index, TId const & mwmId) { - auto const it = m_ranks.find(mwmId); + auto const it = m_ranks.find(TKey(mwmId)); if (it != m_ranks.end()) return *it->second; - auto table = RankTable::Load(value.m_cont); + + TKey handle(index.GetMwmHandleById(mwmId)); + auto table = RankTable::Load(handle.GetValue()->m_cont); if (!table) table.reset(new DummyRankTable()); - auto const * result = table.get(); - m_ranks[mwmId] = move(table); - return *result; + + return *(m_ranks.emplace(move(handle), move(table)).first->second.get()); +} + +void RankTableCache::Remove(TId const & id) +{ + m_ranks.erase(TKey(id)); +} + +void RankTableCache::Clear() +{ + m_ranks.clear(); } -void RankTableCache::Clear() { m_ranks.clear(); } } // namespace v2 } // namespace search diff --git a/search/v2/rank_table_cache.hpp b/search/v2/rank_table_cache.hpp index f52d55ed00..d4cac4041a 100644 --- a/search/v2/rank_table_cache.hpp +++ b/search/v2/rank_table_cache.hpp @@ -1,13 +1,11 @@ #pragma once -#include "indexer/mwm_set.hpp" - -#include "std/map.hpp" -#include "std/unique_ptr.hpp" +#include "indexer/index.hpp" #include "base/macros.hpp" -class MwmValue; +#include "std/map.hpp" +#include "std/unique_ptr.hpp" namespace search { @@ -17,17 +15,41 @@ namespace v2 { class RankTableCache { + using TId = MwmSet::MwmId; + + struct TKey : public MwmSet::MwmHandle + { + TKey() = default; + TKey(TKey &&) = default; + + explicit TKey(TId const & id) + { + this->m_mwmId = id; + } + explicit TKey(MwmSet::MwmHandle && handle) + : MwmSet::MwmHandle(move(handle)) + { + } + }; + public: - RankTableCache(); + RankTableCache() = default; - ~RankTableCache(); - - RankTable const & Get(MwmValue & value, MwmSet::MwmId const & mwmId); + RankTable const & Get(Index & index, TId const & mwmId); + void Remove(TId const & id); void Clear(); private: - map> m_ranks; + struct Compare + { + bool operator() (TKey const & r1, TKey const & r2) const + { + return (r1.GetId() < r2.GetId()); + } + }; + + map, Compare> m_ranks; DISALLOW_COPY_AND_MOVE(RankTableCache); }; diff --git a/search/v2/search_query_v2.cpp b/search/v2/search_query_v2.cpp index 882f1826fe..ab5e2b151c 100644 --- a/search/v2/search_query_v2.cpp +++ b/search/v2/search_query_v2.cpp @@ -71,6 +71,7 @@ void SearchQueryV2::AddPreResults1(vector & results) while (ie != results.end() && ie->m_mwmId == ib->m_mwmId) ++ie; + /// @todo Add RankTableCache here? MwmSet::MwmHandle handle = m_index.GetMwmHandleById(ib->m_mwmId); if (handle.IsAlive()) {