diff --git a/generator/feature_builder.cpp b/generator/feature_builder.cpp index 60864033d5..14dc427db1 100644 --- a/generator/feature_builder.cpp +++ b/generator/feature_builder.cpp @@ -10,6 +10,7 @@ #include "indexer/feature_impl.hpp" #include "indexer/feature_visibility.hpp" #include "indexer/ftypes_matcher.hpp" +#include "indexer/search_string_utils.hpp" #include "coding/bit_streams.hpp" #include "coding/byte_stream.hpp" @@ -300,6 +301,15 @@ void FeatureBuilder::RemoveUselessNames() if (range.first == -1) m_params.name.Clear(); } + + // We want to skip alt_name which is almost equal to name. + std::string altName; + std::string name; + if (m_params.name.GetString("alt_name", altName) && m_params.name.GetString("default", name) && + search::NormalizeAndSimplifyString(altName) == search::NormalizeAndSimplifyString(name)) + { + m_params.name.RemoveString("alt_name"); + } } } diff --git a/generator/generator_tests/feature_builder_test.cpp b/generator/generator_tests/feature_builder_test.cpp index 6314313442..2b8a6b4900 100644 --- a/generator/generator_tests/feature_builder_test.cpp +++ b/generator/generator_tests/feature_builder_test.cpp @@ -284,3 +284,62 @@ UNIT_TEST(FeatureBuilder_SerializeAccuratelyForIntermediate) TEST(fb2.IsValid(), (fb2)); TEST(fb1.IsExactEq(fb2), ()); } + +UNIT_CLASS_TEST(TestWithClassificator, FBuilder_RemoveUselessAltName) +{ + auto const kDefault = StringUtf8Multilang::kDefaultCode; + auto const kAltName = StringUtf8Multilang::GetLangIndex("alt_name"); + + { + FeatureBuilderParams params; + + char const * arr[][2] = {{"amenity", "shop"}}; + AddTypes(params, arr); + params.FinishAddingTypes(); + + // We should remove alt_name which is almost equal to name. + params.AddName("default", "Перекрёсток"); + params.AddName("alt_name", "Перекресток"); + + FeatureBuilder fb; + fb.SetParams(params); + + fb.SetCenter(m2::PointD(0.0, 0.0)); + + TEST(!fb.GetName(kDefault).empty(), ()); + TEST(!fb.GetName(kAltName).empty(), ()); + + fb.RemoveUselessNames(); + + TEST(!fb.GetName(kDefault).empty(), ()); + TEST(fb.GetName(kAltName).empty(), ()); + + TEST(fb.IsValid(), (fb)); + } + { + FeatureBuilderParams params; + + char const * arr[][2] = {{"amenity", "shop"}}; + AddTypes(params, arr); + params.FinishAddingTypes(); + + // We should not remove alt_name which differs from name. + params.AddName("default", "Государственный Универсальный Магазин"); + params.AddName("alt_name", "ГУМ"); + + FeatureBuilder fb; + fb.SetParams(params); + + fb.SetCenter(m2::PointD(0.0, 0.0)); + + TEST(!fb.GetName(kDefault).empty(), ()); + TEST(!fb.GetName(StringUtf8Multilang::GetLangIndex("alt_name")).empty(), ()); + + fb.RemoveUselessNames(); + + TEST(!fb.GetName(kDefault).empty(), ()); + TEST(!fb.GetName(kAltName).empty(), ()); + + TEST(fb.IsValid(), (fb)); + } +}