From 0444d83d8f54f7681479ef89b3fa2cc6da320a26 Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Mon, 14 Aug 2017 17:23:13 +0300 Subject: [PATCH] [search] SearchModel -> Model. --- search/features_layer.cpp | 2 +- search/features_layer.hpp | 2 +- search/features_layer_matcher.hpp | 37 ++++---- search/features_layer_path_finder.cpp | 4 +- search/geocoder.cpp | 90 +++++++++---------- search/geocoder.hpp | 11 ++- search/geocoder_locality.cpp | 8 +- search/geocoder_locality.hpp | 6 +- search/intersection_result.cpp | 20 ++--- search/intersection_result.hpp | 2 +- search/model.cpp | 46 +++++----- search/model.hpp | 26 +++--- search/pre_ranking_info.cpp | 6 +- search/pre_ranking_info.hpp | 16 ++-- search/ranker.cpp | 25 +++--- search/ranking_info.cpp | 10 +-- search/ranking_info.hpp | 2 +- .../pre_ranker_test.cpp | 2 +- 18 files changed, 154 insertions(+), 161 deletions(-) diff --git a/search/features_layer.cpp b/search/features_layer.cpp index 0f0e4fbe20..7672eb151f 100644 --- a/search/features_layer.cpp +++ b/search/features_layer.cpp @@ -13,7 +13,7 @@ void FeaturesLayer::Clear() m_sortedFeatures = nullptr; m_subQuery.clear(); m_tokenRange.Clear(); - m_type = SearchModel::SEARCH_TYPE_COUNT; + m_type = Model::TYPE_COUNT; m_hasDelayedFeatures = false; m_lastTokenIsPrefix = false; } diff --git a/search/features_layer.hpp b/search/features_layer.hpp index ce6368351a..c7f7ec6ad1 100644 --- a/search/features_layer.hpp +++ b/search/features_layer.hpp @@ -24,7 +24,7 @@ struct FeaturesLayer strings::UniString m_subQuery; TokenRange m_tokenRange; - SearchModel::SearchType m_type; + Model::Type m_type; // *NOTE* This field is meaningful only when m_type equals to // SEARCH_TYPE_BUILDING. diff --git a/search/features_layer_matcher.hpp b/search/features_layer_matcher.hpp index 0d2392e0ac..204f61854d 100644 --- a/search/features_layer_matcher.hpp +++ b/search/features_layer_matcher.hpp @@ -70,24 +70,23 @@ public: return; switch (parent.m_type) { - case SearchModel::SEARCH_TYPE_POI: - case SearchModel::SEARCH_TYPE_CITY: - case SearchModel::SEARCH_TYPE_VILLAGE: - case SearchModel::SEARCH_TYPE_STATE: - case SearchModel::SEARCH_TYPE_COUNTRY: - case SearchModel::SEARCH_TYPE_UNCLASSIFIED: - case SearchModel::SEARCH_TYPE_COUNT: + case Model::TYPE_POI: + case Model::TYPE_CITY: + case Model::TYPE_VILLAGE: + case Model::TYPE_STATE: + case Model::TYPE_COUNTRY: + case Model::TYPE_UNCLASSIFIED: + case Model::TYPE_COUNT: ASSERT(false, ("Invalid parent layer type:", parent.m_type)); break; - case SearchModel::SEARCH_TYPE_BUILDING: - ASSERT_EQUAL(child.m_type, SearchModel::SEARCH_TYPE_POI, ()); + case Model::TYPE_BUILDING: + ASSERT_EQUAL(child.m_type, Model::TYPE_POI, ()); MatchPOIsWithBuildings(child, parent, forward(fn)); break; - case SearchModel::SEARCH_TYPE_STREET: - ASSERT(child.m_type == SearchModel::SEARCH_TYPE_POI || - child.m_type == SearchModel::SEARCH_TYPE_BUILDING, + case Model::TYPE_STREET: + ASSERT(child.m_type == Model::TYPE_POI || child.m_type == Model::TYPE_BUILDING, ("Invalid child layer type:", child.m_type)); - if (child.m_type == SearchModel::SEARCH_TYPE_POI) + if (child.m_type == Model::TYPE_POI) MatchPOIsWithStreets(child, parent, forward(fn)); else MatchBuildingsWithStreets(child, parent, forward(fn)); @@ -105,8 +104,8 @@ private: // each building, tries to find all POIs located at distance less // than kBuildingRadiusMeters. - ASSERT_EQUAL(child.m_type, SearchModel::SEARCH_TYPE_POI, ()); - ASSERT_EQUAL(parent.m_type, SearchModel::SEARCH_TYPE_BUILDING, ()); + ASSERT_EQUAL(child.m_type, Model::TYPE_POI, ()); + ASSERT_EQUAL(parent.m_type, Model::TYPE_BUILDING, ()); auto const & pois = *child.m_sortedFeatures; auto const & buildings = *parent.m_sortedFeatures; @@ -182,8 +181,8 @@ private: template void MatchPOIsWithStreets(FeaturesLayer const & child, FeaturesLayer const & parent, TFn && fn) { - ASSERT_EQUAL(child.m_type, SearchModel::SEARCH_TYPE_POI, ()); - ASSERT_EQUAL(parent.m_type, SearchModel::SEARCH_TYPE_STREET, ()); + ASSERT_EQUAL(child.m_type, Model::TYPE_POI, ()); + ASSERT_EQUAL(parent.m_type, Model::TYPE_STREET, ()); auto const & pois = *child.m_sortedFeatures; auto const & streets = *parent.m_sortedFeatures; @@ -218,8 +217,8 @@ private: void MatchBuildingsWithStreets(FeaturesLayer const & child, FeaturesLayer const & parent, TFn && fn) { - ASSERT_EQUAL(child.m_type, SearchModel::SEARCH_TYPE_BUILDING, ()); - ASSERT_EQUAL(parent.m_type, SearchModel::SEARCH_TYPE_STREET, ()); + ASSERT_EQUAL(child.m_type, Model::TYPE_BUILDING, ()); + ASSERT_EQUAL(parent.m_type, Model::TYPE_STREET, ()); auto const & buildings = *child.m_sortedFeatures; auto const & streets = *parent.m_sortedFeatures; diff --git a/search/features_layer_path_finder.cpp b/search/features_layer_path_finder.cpp index b767413daf..66b72e773d 100644 --- a/search/features_layer_path_finder.cpp +++ b/search/features_layer_path_finder.cpp @@ -116,7 +116,7 @@ void FeaturesLayerPathFinder::FindReachableVerticesTopDown( FeaturesLayer child(*layers[i - 1]); child.m_hasDelayedFeatures = - child.m_type == SearchModel::SEARCH_TYPE_BUILDING && + child.m_type == Model::TYPE_BUILDING && house_numbers::LooksLikeHouseNumber(child.m_subQuery, child.m_lastTokenIsPrefix); buffer.clear(); @@ -164,7 +164,7 @@ void FeaturesLayerPathFinder::FindReachableVerticesBottomUp( FeaturesLayer parent(*layers[i + 1]); parent.m_hasDelayedFeatures = - parent.m_type == SearchModel::SEARCH_TYPE_BUILDING && + parent.m_type == Model::TYPE_BUILDING && house_numbers::LooksLikeHouseNumber(parent.m_subQuery, parent.m_lastTokenIsPrefix); buffer.clear(); diff --git a/search/geocoder.cpp b/search/geocoder.cpp index 2e88d511e3..c0e9366913 100644 --- a/search/geocoder.cpp +++ b/search/geocoder.cpp @@ -549,8 +549,7 @@ void Geocoder::InitBaseContext(BaseContext & ctx) ctx.m_hotelsFilter = m_hotelsFilter.MakeScopedFilter(*m_context, m_params.m_hotelsFilter); } -void Geocoder::InitLayer(SearchModel::SearchType type, TokenRange const & tokenRange, - FeaturesLayer & layer) +void Geocoder::InitLayer(Model::Type type, TokenRange const & tokenRange, FeaturesLayer & layer) { layer.Clear(); layer.m_type = type; @@ -613,9 +612,9 @@ void Geocoder::FillLocalitiesTable(BaseContext const & ctx) } }; - switch (m_model.GetSearchType(ft)) + switch (m_model.GetType(ft)) { - case SearchModel::SEARCH_TYPE_CITY: + case Model::TYPE_CITY: { if (numCities < kMaxNumCities && ft.GetFeatureType() == feature::GEOM_POINT) { @@ -625,7 +624,7 @@ void Geocoder::FillLocalitiesTable(BaseContext const & ctx) auto const population = ftypes::GetPopulation(ft); auto const radius = ftypes::GetRadiusByPopulation(population); - City city(l, SearchModel::SEARCH_TYPE_CITY); + City city(l, Model::TYPE_CITY); city.m_rect = MercatorBounds::RectByCenterXYAndSizeInMeters(center, radius); #if defined(DEBUG) @@ -637,12 +636,12 @@ void Geocoder::FillLocalitiesTable(BaseContext const & ctx) } break; } - case SearchModel::SEARCH_TYPE_STATE: + case Model::TYPE_STATE: { addRegionMaps(kMaxNumStates, Region::TYPE_STATE, numStates); break; } - case SearchModel::SEARCH_TYPE_COUNTRY: + case Model::TYPE_COUNTRY: { addRegionMaps(kMaxNumCountries, Region::TYPE_COUNTRY, numCountries); break; @@ -665,13 +664,13 @@ void Geocoder::FillVillageLocalities(BaseContext const & ctx) if (!m_context->GetFeature(l.m_featureId, ft)) continue; - if (m_model.GetSearchType(ft) != SearchModel::SEARCH_TYPE_VILLAGE) + if (m_model.GetType(ft) != Model::TYPE_VILLAGE) continue; // We accept lines and areas as village features. auto const center = feature::GetCenter(ft); ++numVillages; - City village(l, SearchModel::SEARCH_TYPE_VILLAGE); + City village(l, Model::TYPE_VILLAGE); auto const population = ftypes::GetPopulation(ft); auto const radius = ftypes::GetRadiusByPopulation(population); @@ -917,7 +916,7 @@ void Geocoder::CreateStreetsLayerAndMatchLowerLayers(BaseContext & ctx, MY_SCOPE_GUARD(cleanupGuard, bind(&vector::pop_back, &layers)); auto & layer = layers.back(); - InitLayer(SearchModel::SEARCH_TYPE_STREET, prediction.m_tokenRange, layer); + InitLayer(Model::TYPE_STREET, prediction.m_tokenRange, layer); vector sortedFeatures; sortedFeatures.reserve(prediction.m_features.PopCount()); @@ -953,17 +952,17 @@ void Geocoder::MatchPOIsAndBuildings(BaseContext & ctx, size_t curToken) filtered = m_filter->Filter(m_postcodes.m_features); filtered.ForEach([&](uint64_t bit) { auto const featureId = base::asserted_cast(bit); - SearchModel::SearchType searchType; - if (GetSearchTypeInGeocoding(ctx, featureId, searchType)) + Model::Type type; + if (GetTypeInGeocoding(ctx, featureId, type)) { - EmitResult(ctx, m_context->GetId(), featureId, searchType, m_postcodes.m_tokenRange, + EmitResult(ctx, m_context->GetId(), featureId, type, m_postcodes.m_tokenRange, nullptr /* geoParts */); } }); return; } - if (!(layers.size() == 1 && layers[0].m_type == SearchModel::SEARCH_TYPE_STREET)) + if (!(layers.size() == 1 && layers[0].m_type == Model::TYPE_STREET)) return FindPaths(ctx); // If there're only one street layer but user also entered a @@ -978,8 +977,8 @@ void Geocoder::MatchPOIsAndBuildings(BaseContext & ctx, size_t curToken) { if (!m_postcodes.m_features.HasBit(id)) continue; - EmitResult(ctx, m_context->GetId(), id, SearchModel::SEARCH_TYPE_STREET, - layers.back().m_tokenRange, nullptr /* geoParts */); + EmitResult(ctx, m_context->GetId(), id, Model::TYPE_STREET, layers.back().m_tokenRange, + nullptr /* geoParts */); } } @@ -989,7 +988,7 @@ void Geocoder::MatchPOIsAndBuildings(BaseContext & ctx, size_t curToken) MY_SCOPE_GUARD(cleanupGuard, bind(&vector::pop_back, &layers)); auto & layer = layers.back(); - InitLayer(SearchModel::SEARCH_TYPE_BUILDING, m_postcodes.m_tokenRange, layer); + InitLayer(Model::TYPE_BUILDING, m_postcodes.m_tokenRange, layer); vector features; m_postcodes.m_features.ForEach([&features](uint64_t bit) { @@ -1004,7 +1003,7 @@ void Geocoder::MatchPOIsAndBuildings(BaseContext & ctx, size_t curToken) // Clusters of features by search type. Each cluster is a sorted // list of ids. - size_t const kNumClusters = SearchModel::SEARCH_TYPE_BUILDING + 1; + size_t const kNumClusters = Model::TYPE_BUILDING + 1; vector clusters[kNumClusters]; // Appends |featureId| to the end of the corresponding cluster, if @@ -1012,17 +1011,16 @@ void Geocoder::MatchPOIsAndBuildings(BaseContext & ctx, size_t curToken) auto clusterize = [&](uint64_t bit) { auto const featureId = base::asserted_cast(bit); - SearchModel::SearchType searchType; - if (!GetSearchTypeInGeocoding(ctx, featureId, searchType)) + Model::Type type; + if (!GetTypeInGeocoding(ctx, featureId, type)) return; - // All SEARCH_TYPE_CITY features were filtered in - // MatchCities(). All SEARCH_TYPE_STREET features were - // filtered in GreedilyMatchStreets(). - if (searchType < kNumClusters) + // All TYPE_CITY features were filtered in MatchCities(). All + // TYPE_STREET features were filtered in GreedilyMatchStreets(). + if (type < kNumClusters) { if (m_postcodes.m_features.IsEmpty() || m_postcodes.m_features.HasBit(featureId)) - clusters[searchType].push_back(featureId); + clusters[type].push_back(featureId); } }; @@ -1099,7 +1097,7 @@ void Geocoder::MatchPOIsAndBuildings(BaseContext & ctx, size_t curToken) auto & layer = layers.back(); layer.m_sortedFeatures = &clusters[i]; - if (i == SearchModel::SEARCH_TYPE_BUILDING) + if (i == Model::TYPE_BUILDING) { if (layer.m_sortedFeatures->empty() && !looksLikeHouseNumber) continue; @@ -1109,7 +1107,7 @@ void Geocoder::MatchPOIsAndBuildings(BaseContext & ctx, size_t curToken) continue; } - layer.m_type = static_cast(i); + layer.m_type = static_cast(i); if (IsLayerSequenceSane(layers)) MatchPOIsAndBuildings(ctx, curToken + n); } @@ -1119,8 +1117,7 @@ void Geocoder::MatchPOIsAndBuildings(BaseContext & ctx, size_t curToken) bool Geocoder::IsLayerSequenceSane(vector const & layers) const { ASSERT(!layers.empty(), ()); - static_assert(SearchModel::SEARCH_TYPE_COUNT <= 32, - "Select a wider type to represent search types mask."); + static_assert(Model::TYPE_COUNT <= 32, "Select a wider type to represent search types mask."); uint32_t mask = 0; size_t buildingIndex = layers.size(); size_t streetIndex = layers.size(); @@ -1130,7 +1127,7 @@ bool Geocoder::IsLayerSequenceSane(vector const & layers) const for (size_t i = 0; i < layers.size(); ++i) { auto const & layer = layers[i]; - ASSERT_NOT_EQUAL(layer.m_type, SearchModel::SEARCH_TYPE_COUNT, ()); + ASSERT_NOT_EQUAL(layer.m_type, Model::TYPE_COUNT, ()); // TODO (@y): probably it's worth to check belongs-to-locality here. uint32_t bit = 1U << layer.m_type; @@ -1138,9 +1135,9 @@ bool Geocoder::IsLayerSequenceSane(vector const & layers) const return false; mask |= bit; - if (layer.m_type == SearchModel::SEARCH_TYPE_BUILDING) + if (layer.m_type == Model::TYPE_BUILDING) buildingIndex = i; - else if (layer.m_type == SearchModel::SEARCH_TYPE_STREET) + else if (layer.m_type == Model::TYPE_STREET) streetIndex = i; } @@ -1189,7 +1186,7 @@ void Geocoder::FindPaths(BaseContext const & ctx) } void Geocoder::EmitResult(BaseContext const & ctx, MwmSet::MwmId const & mwmId, uint32_t ftId, - SearchModel::SearchType type, TokenRange const & tokenRange, + Model::Type type, TokenRange const & tokenRange, IntersectionResult const * geoParts) { FeatureID id(mwmId, ftId); @@ -1197,7 +1194,7 @@ void Geocoder::EmitResult(BaseContext const & ctx, MwmSet::MwmId const & mwmId, if (ctx.m_hotelsFilter && !ctx.m_hotelsFilter->Matches(id)) return; - if (m_params.m_cianMode && type != SearchModel::SEARCH_TYPE_BUILDING) + if (m_params.m_cianMode && type != Model::TYPE_BUILDING) return; // Distance and rank will be filled at the end, for all results at once. @@ -1211,13 +1208,13 @@ void Geocoder::EmitResult(BaseContext const & ctx, MwmSet::MwmId const & mwmId, for (auto const * region : ctx.m_regions) { - auto const regionType = Region::ToSearchType(region->m_type); - ASSERT_NOT_EQUAL(regionType, SearchModel::SEARCH_TYPE_COUNT, ()); + auto const regionType = Region::ToModelType(region->m_type); + ASSERT_NOT_EQUAL(regionType, Model::TYPE_COUNT, ()); info.m_tokenRange[regionType] = region->m_tokenRange; } if (ctx.m_city) - info.m_tokenRange[SearchModel::SEARCH_TYPE_CITY] = ctx.m_city->m_tokenRange; + info.m_tokenRange[Model::TYPE_CITY] = ctx.m_city->m_tokenRange; if (geoParts) info.m_geoParts = *geoParts; @@ -1228,7 +1225,7 @@ void Geocoder::EmitResult(BaseContext const & ctx, MwmSet::MwmId const & mwmId, void Geocoder::EmitResult(BaseContext const & ctx, Region const & region, TokenRange const & tokenRange) { - auto const type = Region::ToSearchType(region.m_type); + auto const type = Region::ToModelType(region.m_type); EmitResult(ctx, region.m_countryId, region.m_featureId, type, tokenRange, nullptr /* geoParts */); } @@ -1268,12 +1265,12 @@ void Geocoder::MatchUnclassified(BaseContext & ctx, size_t curToken) auto emitUnclassified = [&](uint64_t bit) { auto const featureId = base::asserted_cast(bit); - SearchModel::SearchType searchType; - if (!GetSearchTypeInGeocoding(ctx, featureId, searchType)) + Model::Type type; + if (!GetTypeInGeocoding(ctx, featureId, type)) return; - if (searchType == SearchModel::SEARCH_TYPE_UNCLASSIFIED) + if (type == Model::TYPE_UNCLASSIFIED) { - EmitResult(ctx, m_context->GetId(), featureId, searchType, TokenRange(startToken, curToken), + EmitResult(ctx, m_context->GetId(), featureId, type, TokenRange(startToken, curToken), nullptr /* geoParts */); } }; @@ -1296,24 +1293,23 @@ CBV Geocoder::RetrieveGeometryFeatures(MwmContext const & context, m2::RectD con } } -bool Geocoder::GetSearchTypeInGeocoding(BaseContext const & ctx, uint32_t featureId, - SearchModel::SearchType & searchType) +bool Geocoder::GetTypeInGeocoding(BaseContext const & ctx, uint32_t featureId, Model::Type & type) { if (ctx.m_streets.HasBit(featureId)) { - searchType = SearchModel::SEARCH_TYPE_STREET; + type = Model::TYPE_STREET; return true; } if (ctx.m_villages.HasBit(featureId)) { - searchType = SearchModel::SEARCH_TYPE_VILLAGE; + type = Model::TYPE_VILLAGE; return true; } FeatureType feature; if (m_context->GetFeature(featureId, feature)) { - searchType = m_model.GetSearchType(feature); + type = m_model.GetType(feature); return true; } diff --git a/search/geocoder.hpp b/search/geocoder.hpp index 51729a6bfb..ea2fbaba8c 100644 --- a/search/geocoder.hpp +++ b/search/geocoder.hpp @@ -133,8 +133,7 @@ private: // for each token and saves it to m_addressFeatures. void InitBaseContext(BaseContext & ctx); - void InitLayer(SearchModel::SearchType type, TokenRange const & tokenRange, - FeaturesLayer & layer); + void InitLayer(Model::Type type, TokenRange const & tokenRange, FeaturesLayer & layer); void FillLocalityCandidates(BaseContext const & ctx, CBV const & filter, size_t const maxNumLocalities, @@ -195,7 +194,7 @@ private: // Forms result and feeds it to |m_preRanker|. void EmitResult(BaseContext const & ctx, MwmSet::MwmId const & mwmId, uint32_t ftId, - SearchModel::SearchType type, TokenRange const & tokenRange, + Model::Type type, TokenRange const & tokenRange, IntersectionResult const * geoParts); void EmitResult(BaseContext const & ctx, Region const & region, TokenRange const & tokenRange); void EmitResult(BaseContext const & ctx, City const & city, TokenRange const & tokenRange); @@ -213,8 +212,8 @@ private: // This is a faster wrapper around SearchModel::GetSearchType(), as // it uses pre-loaded lists of streets and villages. - WARN_UNUSED_RESULT bool GetSearchTypeInGeocoding(BaseContext const & ctx, uint32_t featureId, - SearchModel::SearchType & searchType); + WARN_UNUSED_RESULT bool GetTypeInGeocoding(BaseContext const & ctx, uint32_t featureId, + Model::Type & type); Index const & m_index; @@ -232,7 +231,7 @@ private: // This field is used to map features to a limited number of search // classes. - SearchModel m_model; + Model m_model; // Following fields are set up by Search() method and can be // modified and used only from Search() or its callees. diff --git a/search/geocoder_locality.cpp b/search/geocoder_locality.cpp index 4d80fbd20e..ec3df798f4 100644 --- a/search/geocoder_locality.cpp +++ b/search/geocoder_locality.cpp @@ -5,13 +5,13 @@ namespace search { // static -SearchModel::SearchType Region::ToSearchType(Type type) +Model::Type Region::ToModelType(Type type) { switch (type) { - case Region::TYPE_STATE: return SearchModel::SEARCH_TYPE_STATE; - case Region::TYPE_COUNTRY: return SearchModel::SEARCH_TYPE_COUNTRY; - case Region::TYPE_COUNT: return SearchModel::SEARCH_TYPE_COUNT; + case Region::TYPE_STATE: return Model::TYPE_STATE; + case Region::TYPE_COUNTRY: return Model::TYPE_COUNTRY; + case Region::TYPE_COUNT: return Model::TYPE_COUNT; } } diff --git a/search/geocoder_locality.hpp b/search/geocoder_locality.hpp index 1f2ea163f5..850a465d29 100644 --- a/search/geocoder_locality.hpp +++ b/search/geocoder_locality.hpp @@ -48,7 +48,7 @@ struct Region : public Locality Region(Locality const & locality, Type type) : Locality(locality), m_center(0, 0), m_type(type) {} - static SearchModel::SearchType ToSearchType(Type type); + static Model::Type ToModelType(Type type); storage::CountryInfoGetter::TRegionIdSet m_ids; std::string m_defaultName; @@ -63,12 +63,12 @@ struct Region : public Locality // states and Locality for smaller settlements. struct City : public Locality { - City(Locality const & locality, SearchModel::SearchType type) : Locality(locality), m_type(type) + City(Locality const & locality, Model::Type type) : Locality(locality), m_type(type) { } m2::RectD m_rect; - SearchModel::SearchType m_type; + Model::Type m_type; #if defined(DEBUG) std::string m_defaultName; diff --git a/search/intersection_result.cpp b/search/intersection_result.cpp index 898f2c097d..6046974f38 100644 --- a/search/intersection_result.cpp +++ b/search/intersection_result.cpp @@ -7,19 +7,19 @@ namespace search // static uint32_t const IntersectionResult::kInvalidId; -void IntersectionResult::Set(SearchModel::SearchType type, uint32_t id) +void IntersectionResult::Set(Model::Type type, uint32_t id) { switch (type) { - case SearchModel::SEARCH_TYPE_POI: m_poi = id; break; - case SearchModel::SEARCH_TYPE_BUILDING: m_building = id; break; - case SearchModel::SEARCH_TYPE_STREET: m_street = id; break; - case SearchModel::SEARCH_TYPE_CITY: - case SearchModel::SEARCH_TYPE_VILLAGE: - case SearchModel::SEARCH_TYPE_STATE: - case SearchModel::SEARCH_TYPE_COUNTRY: - case SearchModel::SEARCH_TYPE_UNCLASSIFIED: - case SearchModel::SEARCH_TYPE_COUNT: ASSERT(false, ("Unsupported type.")); break; + case Model::TYPE_POI: m_poi = id; break; + case Model::TYPE_BUILDING: m_building = id; break; + case Model::TYPE_STREET: m_street = id; break; + case Model::TYPE_CITY: + case Model::TYPE_VILLAGE: + case Model::TYPE_STATE: + case Model::TYPE_COUNTRY: + case Model::TYPE_UNCLASSIFIED: + case Model::TYPE_COUNT: ASSERT(false, ("Unsupported type.")); break; } } diff --git a/search/intersection_result.hpp b/search/intersection_result.hpp index b0fd8f10a6..2f630ef9aa 100644 --- a/search/intersection_result.hpp +++ b/search/intersection_result.hpp @@ -14,7 +14,7 @@ struct IntersectionResult { static uint32_t constexpr kInvalidId = std::numeric_limits::max(); - void Set(SearchModel::SearchType type, uint32_t id); + void Set(Model::Type type, uint32_t id); // Returns the first valid feature among the [POI, BUILDING, // STREET]. diff --git a/search/model.cpp b/search/model.cpp index e402255bf5..a95fbbae0a 100644 --- a/search/model.cpp +++ b/search/model.cpp @@ -99,7 +99,7 @@ private: }; } // namespace -SearchModel::SearchType SearchModel::GetSearchType(FeatureType const & feature) const +Model::Type Model::GetType(FeatureType const & feature) const { static auto const & buildingChecker = CustomIsBuildingChecker::Instance(); static auto const & cianChecker = IsCianChecker::Instance(); @@ -108,48 +108,48 @@ SearchModel::SearchType SearchModel::GetSearchType(FeatureType const & feature) static auto const & poiChecker = IsPoiChecker::Instance(); if (m_cianEnabled && cianChecker(feature)) - return SEARCH_TYPE_BUILDING; + return TYPE_BUILDING; if (!m_cianEnabled && buildingChecker(feature)) - return SEARCH_TYPE_BUILDING; + return TYPE_BUILDING; if (streetChecker(feature)) - return SEARCH_TYPE_STREET; + return TYPE_STREET; if (localityChecker(feature)) { - Type type = localityChecker.GetType(feature); + auto const type = localityChecker.GetType(feature); switch (type) { - case NONE: ASSERT(false, ("Unknown locality.")); return SEARCH_TYPE_UNCLASSIFIED; - case STATE: return SEARCH_TYPE_STATE; - case COUNTRY: return SEARCH_TYPE_COUNTRY; + case NONE: ASSERT(false, ("Unknown locality.")); return TYPE_UNCLASSIFIED; + case STATE: return TYPE_STATE; + case COUNTRY: return TYPE_COUNTRY; case CITY: - case TOWN: return SEARCH_TYPE_CITY; - case VILLAGE: return SEARCH_TYPE_VILLAGE; - case LOCALITY_COUNT: return SEARCH_TYPE_UNCLASSIFIED; + case TOWN: return TYPE_CITY; + case VILLAGE: return TYPE_VILLAGE; + case LOCALITY_COUNT: return TYPE_UNCLASSIFIED; } } if (poiChecker(feature)) - return SEARCH_TYPE_POI; + return TYPE_POI; - return SEARCH_TYPE_UNCLASSIFIED; + return TYPE_UNCLASSIFIED; } -string DebugPrint(SearchModel::SearchType type) +string DebugPrint(Model::Type type) { switch (type) { - case SearchModel::SEARCH_TYPE_POI: return "POI"; - case SearchModel::SEARCH_TYPE_BUILDING: return "Building"; - case SearchModel::SEARCH_TYPE_STREET: return "Street"; - case SearchModel::SEARCH_TYPE_CITY: return "City"; - case SearchModel::SEARCH_TYPE_VILLAGE: return "Village"; - case SearchModel::SEARCH_TYPE_STATE: return "State"; - case SearchModel::SEARCH_TYPE_COUNTRY: return "Country"; - case SearchModel::SEARCH_TYPE_UNCLASSIFIED: return "Unclassified"; - case SearchModel::SEARCH_TYPE_COUNT: return "Count"; + case Model::TYPE_POI: return "POI"; + case Model::TYPE_BUILDING: return "Building"; + case Model::TYPE_STREET: return "Street"; + case Model::TYPE_CITY: return "City"; + case Model::TYPE_VILLAGE: return "Village"; + case Model::TYPE_STATE: return "State"; + case Model::TYPE_COUNTRY: return "Country"; + case Model::TYPE_UNCLASSIFIED: return "Unclassified"; + case Model::TYPE_COUNT: return "Count"; } ASSERT(false, ("Unknown search type:", static_cast(type))); return string(); diff --git a/search/model.hpp b/search/model.hpp index 7f43d1287c..39cafc3e0d 100644 --- a/search/model.hpp +++ b/search/model.hpp @@ -22,32 +22,32 @@ public: // This class is used to map feature types to a restricted set of // different search classes (do not confuse these classes with search // categories - they are completely different things). -class SearchModel +class Model { public: - enum SearchType + enum Type { // Low-level features such as amenities, offices, shops, buildings // without house number, etc. - SEARCH_TYPE_POI, + TYPE_POI, // All features with set house number. - SEARCH_TYPE_BUILDING, + TYPE_BUILDING, - SEARCH_TYPE_STREET, + TYPE_STREET, // All low-level features except POI, BUILDING and STREET. - SEARCH_TYPE_UNCLASSIFIED, + TYPE_UNCLASSIFIED, - SEARCH_TYPE_VILLAGE, - SEARCH_TYPE_CITY, - SEARCH_TYPE_STATE, // US or Canadian states - SEARCH_TYPE_COUNTRY, + TYPE_VILLAGE, + TYPE_CITY, + TYPE_STATE, // US or Canadian states + TYPE_COUNTRY, - SEARCH_TYPE_COUNT + TYPE_COUNT }; - SearchType GetSearchType(FeatureType const & feature) const; + Type GetType(FeatureType const & feature) const; void SetCianEnabled(bool enabled) { m_cianEnabled = enabled; } @@ -55,5 +55,5 @@ private: bool m_cianEnabled = false; }; -string DebugPrint(SearchModel::SearchType type); +string DebugPrint(Model::Type type); } // namespace search diff --git a/search/pre_ranking_info.cpp b/search/pre_ranking_info.cpp index 5b579d7ae4..c3df59e300 100644 --- a/search/pre_ranking_info.cpp +++ b/search/pre_ranking_info.cpp @@ -9,16 +9,16 @@ std::string DebugPrint(PreRankingInfo const & info) std::ostringstream os; os << "PreRankingInfo ["; os << "m_distanceToPivot:" << info.m_distanceToPivot << ","; - for (size_t i = 0; i < static_cast(SearchModel::SEARCH_TYPE_COUNT); ++i) + for (size_t i = 0; i < static_cast(Model::TYPE_COUNT); ++i) { if (info.m_tokenRange[i].Empty()) continue; - auto const type = static_cast(i); + auto const type = static_cast(i); os << "m_tokenRange[" << DebugPrint(type) << "]:" << DebugPrint(info.m_tokenRange[i]) << ","; } os << "m_rank:" << static_cast(info.m_rank) << ","; - os << "m_searchType:" << info.m_searchType; + os << "m_type:" << info.m_type; os << "]"; return os.str(); } diff --git a/search/pre_ranking_info.hpp b/search/pre_ranking_info.hpp index c9470f1ac3..6240c719c7 100644 --- a/search/pre_ranking_info.hpp +++ b/search/pre_ranking_info.hpp @@ -15,17 +15,17 @@ namespace search { struct PreRankingInfo { - PreRankingInfo(SearchModel::SearchType type, TokenRange const & range) + PreRankingInfo(Model::Type type, TokenRange const & range) { - ASSERT_LESS(type, SearchModel::SEARCH_TYPE_COUNT, ()); - m_searchType = type; - m_tokenRange[m_searchType] = range; + ASSERT_LESS(type, Model::TYPE_COUNT, ()); + m_type = type; + m_tokenRange[m_type] = range; } inline TokenRange const & InnermostTokenRange() const { - ASSERT_LESS(m_searchType, SearchModel::SEARCH_TYPE_COUNT, ()); - return m_tokenRange[m_searchType]; + ASSERT_LESS(m_type, Model::TYPE_COUNT, ()); + return m_tokenRange[m_type]; } inline size_t GetNumTokens() const { return InnermostTokenRange().Size(); } @@ -38,7 +38,7 @@ struct PreRankingInfo bool m_centerLoaded = false; // Tokens match to the feature name or house number. - TokenRange m_tokenRange[SearchModel::SEARCH_TYPE_COUNT]; + TokenRange m_tokenRange[Model::TYPE_COUNT]; // Different geo-parts extracted from query. Currently only poi, // building and street ids are in |m_geoParts|. @@ -48,7 +48,7 @@ struct PreRankingInfo uint8_t m_rank = 0; // Search type for the feature. - SearchModel::SearchType m_searchType = SearchModel::SEARCH_TYPE_COUNT; + Model::Type m_type = Model::TYPE_COUNT; }; std::string DebugPrint(PreRankingInfo const & info); diff --git a/search/ranker.cpp b/search/ranker.cpp index de51b56031..c180a9f789 100644 --- a/search/ranker.cpp +++ b/search/ranker.cpp @@ -36,7 +36,7 @@ void UpdateNameScore(vector const & tokens, TSlice const & s } NameScore GetNameScore(FeatureType const & ft, Geocoder::Params const & params, - TokenRange const & range, SearchModel::SearchType type) + TokenRange const & range, Model::Type type) { NameScore bestScore = NAME_SCORE_ZERO; TokenSlice slice(params, range); @@ -54,7 +54,7 @@ NameScore GetNameScore(FeatureType const & ft, Geocoder::Params const & params, UpdateNameScore(tokens, sliceNoCategories, bestScore); } - if (type == SearchModel::SEARCH_TYPE_BUILDING) + if (type == Model::TYPE_BUILDING) UpdateNameScore(ft.GetHouseNumber(), sliceNoCategories, bestScore); return bestScore; @@ -209,19 +209,18 @@ class PreResult2Maker info.m_distanceToPivot = MercatorBounds::DistanceOnEarth(center, pivot); info.m_rank = preInfo.m_rank; - info.m_searchType = preInfo.m_searchType; - info.m_nameScore = GetNameScore(ft, m_params, preInfo.InnermostTokenRange(), info.m_searchType); + info.m_type = preInfo.m_type; + info.m_nameScore = GetNameScore(ft, m_params, preInfo.InnermostTokenRange(), info.m_type); - if (info.m_searchType != SearchModel::SEARCH_TYPE_STREET && + if (info.m_type != Model::TYPE_STREET && preInfo.m_geoParts.m_street != IntersectionResult::kInvalidId) { auto const & mwmId = ft.GetID().m_mwmId; FeatureType street; if (LoadFeature(FeatureID(mwmId, preInfo.m_geoParts.m_street), street)) { - NameScore const nameScore = - GetNameScore(street, m_params, preInfo.m_tokenRange[SearchModel::SEARCH_TYPE_STREET], - SearchModel::SEARCH_TYPE_STREET); + NameScore const nameScore = GetNameScore( + street, m_params, preInfo.m_tokenRange[Model::TYPE_STREET], Model::TYPE_STREET); info.m_nameScore = min(info.m_nameScore, nameScore); } } @@ -247,13 +246,13 @@ class PreResult2Maker }); } - uint8_t NormalizeRank(uint8_t rank, SearchModel::SearchType type, m2::PointD const & center, + uint8_t NormalizeRank(uint8_t rank, Model::Type type, m2::PointD const & center, string const & country) { switch (type) { - case SearchModel::SEARCH_TYPE_VILLAGE: return rank /= 1.5; - case SearchModel::SEARCH_TYPE_CITY: + case Model::TYPE_VILLAGE: return rank /= 1.5; + case Model::TYPE_CITY: { if (m_ranker.m_params.m_viewport.IsPointInside(center)) return rank * 2; @@ -266,7 +265,7 @@ class PreResult2Maker if (info.IsNotEmpty() && info.m_name == m_ranker.m_params.m_pivotRegion) return rank *= 1.7; } - case SearchModel::SEARCH_TYPE_COUNTRY: + case Model::TYPE_COUNTRY: return rank /= 1.5; // For all other search types, rank should be zero for now. @@ -297,7 +296,7 @@ public: search::RankingInfo info; InitRankingInfo(ft, center, res1, info); - info.m_rank = NormalizeRank(info.m_rank, info.m_searchType, center, country); + info.m_rank = NormalizeRank(info.m_rank, info.m_type, center, country); res2->SetRankingInfo(move(info)); return res2; diff --git a/search/ranking_info.cpp b/search/ranking_info.cpp index 05f1d3659a..f3cef0300e 100644 --- a/search/ranking_info.cpp +++ b/search/ranking_info.cpp @@ -22,7 +22,7 @@ double const kNameScore[NameScore::NAME_SCORE_COUNT] = { , 0.05384830009390816 /* Full Match */ }; -double const kSearchType[SearchModel::SEARCH_TYPE_COUNT] = { +double const kType[Model::TYPE_COUNT] = { -0.09164609318265761 /* POI */ , -0.09164609318265761 /* Building */ , -0.0805969548653964 /* Street */ @@ -60,7 +60,7 @@ string DebugPrint(RankingInfo const & info) os << "m_distanceToPivot:" << info.m_distanceToPivot << ","; os << "m_rank:" << static_cast(info.m_rank) << ","; os << "m_nameScore:" << DebugPrint(info.m_nameScore) << ","; - os << "m_searchType:" << DebugPrint(info.m_searchType) << ","; + os << "m_type:" << DebugPrint(info.m_type) << ","; os << "m_pureCats:" << info.m_pureCats << ","; os << "m_falseCats:" << info.m_falseCats; os << "]"; @@ -71,7 +71,7 @@ void RankingInfo::ToCSV(ostream & os) const { os << fixed; os << m_distanceToPivot << "," << static_cast(m_rank) << "," << DebugPrint(m_nameScore) - << "," << DebugPrint(m_searchType) << "," << m_pureCats << "," << m_falseCats; + << "," << DebugPrint(m_type) << "," << m_pureCats << "," << m_falseCats; } double RankingInfo::GetLinearModelRank() const @@ -95,8 +95,8 @@ double RankingInfo::GetLinearModelRank() const nameScore = NAME_SCORE_ZERO; } - return kDistanceToPivot * distanceToPivot + kRank * rank + kNameScore[nameScore] + - kSearchType[m_searchType] + m_falseCats * kFalseCats; + return kDistanceToPivot * distanceToPivot + kRank * rank + kNameScore[nameScore] + kType[m_type] + + m_falseCats * kFalseCats; } } // namespace search diff --git a/search/ranking_info.hpp b/search/ranking_info.hpp index cf241a62a5..23080043f5 100644 --- a/search/ranking_info.hpp +++ b/search/ranking_info.hpp @@ -24,7 +24,7 @@ struct RankingInfo NameScore m_nameScore = NAME_SCORE_ZERO; // Search type for the feature. - SearchModel::SearchType m_searchType = SearchModel::SEARCH_TYPE_COUNT; + Model::Type m_type = Model::TYPE_COUNT; // True if all of the tokens that the feature was matched by // correspond to this feature's categories. diff --git a/search/search_integration_tests/pre_ranker_test.cpp b/search/search_integration_tests/pre_ranker_test.cpp index 31612485c2..ae8049d901 100644 --- a/search/search_integration_tests/pre_ranker_test.cpp +++ b/search/search_integration_tests/pre_ranker_test.cpp @@ -131,7 +131,7 @@ UNIT_CLASS_TEST(PreRankerTest, Smoke) FeaturesVectorTest fv(mwmId.GetInfo()->GetLocalFile().GetPath(MapOptions::Map)); fv.GetVector().ForEach([&](FeatureType & ft, uint32_t index) { FeatureID id(mwmId, index); - preRanker.Emplace(id, PreRankingInfo(SearchModel::SEARCH_TYPE_POI, TokenRange(0, 1))); + preRanker.Emplace(id, PreRankingInfo(Model::TYPE_POI, TokenRange(0, 1))); TEST_LESS(index, pois.size(), ()); distances[index] = MercatorBounds::DistanceOnEarth(feature::GetCenter(ft), kPivot);