diff --git a/generator/feature_merger.cpp b/generator/feature_merger.cpp index 703d86703b..516e27665d 100644 --- a/generator/feature_merger.cpp +++ b/generator/feature_merger.cpp @@ -336,20 +336,20 @@ class RemoveSolver bool m_doNotRemoveSponsoredTypes; public: - RemoveSolver(int lowScale, int upScale, bool leaveSpecialTypes, bool leaveSponsoredTypes = true) - : m_lowScale(lowScale), - m_upScale(upScale), - m_doNotRemoveSpecialTypes(leaveSpecialTypes), - m_doNotRemoveSponsoredTypes(leaveSponsoredTypes) + RemoveSolver(int lowScale, int upScale, bool doNotRemoveSpecialTypes, bool doNotRemoveSponsoredTypes) + : m_lowScale(lowScale) + , m_upScale(upScale) + , m_doNotRemoveSpecialTypes(doNotRemoveSpecialTypes) + , m_doNotRemoveSponsoredTypes(doNotRemoveSponsoredTypes) { } bool operator() (uint32_t type) const { - std::pair const range = feature::GetDrawableScaleRange(type); - if (m_doNotRemoveSponsoredTypes && ftypes::IsSponsoredChecker::Instance()(type)) return false; + + std::pair const range = feature::GetDrawableScaleRange(type); // We have feature types without any drawing rules. // This case was processed before: // - feature::TypeAlwaysExists; @@ -370,8 +370,11 @@ bool PreprocessForWorldMap(FeatureBuilder & fb) { int const upperScale = scales::GetUpperWorldScale(); - if (fb.RemoveTypesIf(RemoveSolver(0, upperScale, false))) + if (fb.RemoveTypesIf(RemoveSolver(0, upperScale, false /* doNotRemoveSpecialTypes */, + true /* doNotRemoveSponsoredTypes */))) + { return false; + } fb.RemoveNameIfInvisible(0, upperScale); @@ -382,8 +385,12 @@ bool PreprocessForCountryMap(FeatureBuilder & fb) { using namespace scales; - if (fb.RemoveTypesIf(RemoveSolver(GetUpperWorldScale() + 1, GetUpperStyleScale(), true))) + if (fb.RemoveTypesIf(RemoveSolver(GetUpperWorldScale() + 1, GetUpperStyleScale(), + true /* doNotRemoveSpecialTypes */, + true /* doNotRemoveSponsoredTypes */))) + { return false; + } return true; } diff --git a/generator/feature_processing_layers.cpp b/generator/feature_processing_layers.cpp index 6f5cb44bb7..b9e7a52ff4 100644 --- a/generator/feature_processing_layers.cpp +++ b/generator/feature_processing_layers.cpp @@ -245,8 +245,8 @@ void OpentableLayer::Handle(FeatureBuilder & feature) } -PromoCatalogLayer::PromoCatalogLayer(std::string const & filename) - : m_cities(promo::LoadCities(filename)) +PromoCatalogLayer::PromoCatalogLayer(std::string const & citiesFinename) + : m_cities(promo::LoadCities(citiesFinename)) { } @@ -254,18 +254,12 @@ void PromoCatalogLayer::Handle(FeatureBuilder & feature) { if (ftypes::IsCityTownOrVillage(feature.GetTypes())) { - auto const & ids = feature.GetOsmIds(); - - auto const found = std::any_of(ids.cbegin(), ids.cend(), [this](auto const & id) - { - return m_cities.find(id) != m_cities.cend(); - }); - - if (!found) + if (m_cities.find(feature.GetMostGenericOsmId()) == m_cities.cend()) return; + auto static const kPromoType = classif().GetTypeByPath({"sponsored", "promo_catalog"}); FeatureParams & params = feature.GetParams(); - params.AddType(classif().GetTypeByPath({"sponsored", "promo_catalog"})); + params.AddType(kPromoType); } LayerBase::Handle(feature); } diff --git a/generator/feature_processing_layers.hpp b/generator/feature_processing_layers.hpp index 8a1bfd869a..1f2f871d4a 100644 --- a/generator/feature_processing_layers.hpp +++ b/generator/feature_processing_layers.hpp @@ -163,7 +163,7 @@ private: class PromoCatalogLayer : public LayerBase { public: - explicit PromoCatalogLayer(std::string const & filename); + explicit PromoCatalogLayer(std::string const & citiesFinename); // LayerBase overrides: void Handle(feature::FeatureBuilder & feature) override; diff --git a/generator/generator_tool/CMakeLists.txt b/generator/generator_tool/CMakeLists.txt index 97063bdc66..6a81eca3bf 100644 --- a/generator/generator_tool/CMakeLists.txt +++ b/generator/generator_tool/CMakeLists.txt @@ -22,9 +22,7 @@ omim_link_libraries( search storage editor - partners_api indexer - metrics platform geometry coding diff --git a/generator/promo_catalog_cities.hpp b/generator/promo_catalog_cities.hpp index 3239156ada..f3fe2ffe93 100644 --- a/generator/promo_catalog_cities.hpp +++ b/generator/promo_catalog_cities.hpp @@ -16,40 +16,27 @@ using Cities = std::unordered_set; inline Cities LoadCities(std::string const & filename) { - std::string src; - try - { - FileReader reader(filename); - reader.ReadAsString(src); - } - catch (Reader::Exception const & e) - { - LOG(LERROR, (filename, e.Msg())); + if (filename.empty()) return {}; - } + + std::string src; + FileReader reader(filename); + reader.ReadAsString(src); Cities result; - try + base::Json root(src.c_str()); + auto const dataArray = json_object_get(root.get(), "data"); + + auto const size = json_array_size(dataArray); + + result.reserve(size); + for (size_t i = 0; i < size; ++i) { - base::Json root(src.c_str()); - auto const dataArray = json_object_get(root.get(), "data"); + int64_t id = 0; + auto const obj = json_array_get(dataArray, i); + FromJSONObject(obj, "osmid", id); - auto const size = json_array_size(dataArray); - - result.reserve(size); - for (size_t i = 0; i < size; ++i) - { - int64_t id = 0; - auto const obj = json_array_get(dataArray, i); - FromJSONObject(obj, "osmid", id); - - result.emplace(static_cast(id)); - } - } - catch (base::Json::Exception const & e) - { - LOG(LERROR, (e.Msg())); - result.clear(); + result.emplace(static_cast(id)); } return result; diff --git a/partners_api/promo_api.cpp b/partners_api/promo_api.cpp index afbaaf615b..b138d1ad39 100644 --- a/partners_api/promo_api.cpp +++ b/partners_api/promo_api.cpp @@ -8,8 +8,6 @@ #include "platform/preferred_languages.hpp" #include "platform/settings.hpp" -#include "base/string_utils.hpp" - #include "base/assert.hpp" #include diff --git a/tools/python/post_generation/__main__.py b/tools/python/post_generation/__main__.py index b8645d75ee..4e3dd7bd80 100644 --- a/tools/python/post_generation/__main__.py +++ b/tools/python/post_generation/__main__.py @@ -111,7 +111,7 @@ The post_generation commands are: if not args.output: args.output = os.path.join(args.mwm, "countries.txt") - with open(args.countries, "r") as f: + with open(args.countries) as f: countries = json.load(f) inject_promo_cities(countries, args.promo_cities, args.mwm, args.types, diff --git a/tools/python/post_generation/inject_promo_cities.py b/tools/python/post_generation/inject_promo_cities.py index c4d37e2b01..221fa6ff18 100644 --- a/tools/python/post_generation/inject_promo_cities.py +++ b/tools/python/post_generation/inject_promo_cities.py @@ -1,6 +1,7 @@ import json import logging import os +import re import sys from mwm import mwm @@ -14,7 +15,7 @@ class PromoCities(object): self.osm2ft_path = osm2ft_path def find(self, leaf_id): - result = list() + result = [] ft2osm = load_osm2ft(self.osm2ft_path, leaf_id) with open(os.path.join(self.mwm_path, leaf_id + ".mwm"), "rb") as f: mwm_file = mwm.MWM(f) @@ -30,7 +31,7 @@ class PromoCities(object): city = { "id": osm_id, "count_of_guides": self.cities[osm_id], - "types": list() + "types": [] } for t in types: @@ -38,8 +39,8 @@ class PromoCities(object): city["types"].append(t) if not city["types"]: - logging.error("Incorrect types for sponsored-promo_catalog " - "feature osm_id %s", osm_id) + logging.error(f"Incorrect types for sponsored-promo_catalog " + f"feature osm_id {osm_id}") sys.exit(3) result.append(city) @@ -51,10 +52,7 @@ class PromoCities(object): def key_compare(city): return city["count_of_guides"], score_types(city["types"]) - result = sorted(proposed_cities, key=key_compare, reverse=True) - # Debug - print(result) - return result[0] + return max(proposed_cities, key=key_compare) def place_type_to_int(t): @@ -62,41 +60,24 @@ def place_type_to_int(t): return 1 if t == "place-city": return 2 - if t == "place-city-capital-11": - return 3 - if t == "place-city-capital-10": - return 4 - if t == "place-city-capital-9": - return 5 - if t == "place-city-capital-8": - return 6 - if t == "place-city-capital-7": - return 7 - if t == "place-city-capital-6": - return 8 - if t == "place-city-capital-5": - return 9 - if t == "place-city-capital-4": - return 10 - if t == "place-city-capital-3": - return 11 - if t == "place-city-capital-2": - return 12 - if t == "place-city-capital": - return 13 + + m = re.match(r"^place-city-capital?(-(?P\d+)|)$", t) + if m: + admin_level = int(m.groupdict("1")["admin_level"]) + if 1 <= admin_level <= 12: + return 14 - admin_level return 0 def score_types(types): - ranked = sorted([place_type_to_int(t) for t in types], reverse=True) - return ranked[0] + return max([place_type_to_int(t) for t in types]) def load_cities(path): - with open(path, "r") as f: + with open(path) as f: cities_list = json.load(f) - cities = dict() + cities = {} for city in cities_list["data"]: cities[city["osmid"]] = city["paid_bundles_count"] @@ -106,7 +87,7 @@ def load_cities(path): def load_osm2ft(osm2ft_path, mwm_id): osm2ft_name = os.path.join(osm2ft_path, mwm_id + ".mwm.osm2ft") if not os.path.exists(osm2ft_name): - logging.error("Cannot find %s", osm2ft_name) + logging.error(f"Cannot find {osm2ft_name}") sys.exit(3) with open(osm2ft_name, "rb") as f: return mwm.read_osm2ft(f, ft2osm=True, tuples=False) @@ -125,9 +106,9 @@ def inject_into_leafs(node, cities): best_city = cities.choose_best_city(proposed_cities) if best_city["id"] < 0: - node["pc"] = best_city["id"] + (1 << 64) + node["top_city_geo_id"] = best_city["id"] + (1 << 64) else: - node["pc"] = best_city["id"] + node["top_city_geo_id"] = best_city["id"] def inject_promo_cities(countries_json, promo_cities_path, mwm_path, types_path,