Welcome to mirror list, hosted at ThFree Co, Russian Federation.

new_feature_categories.cpp « indexer - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: cc67efb2205cfb361d97cab2ad72b7f462c3ee80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "new_feature_categories.hpp"

#include "indexer/categories_holder.hpp"
#include "indexer/classificator.hpp"

#include "base/assert.hpp"
#include "base/stl_helpers.hpp"

#include "std/algorithm.hpp"

#include "3party/Alohalytics/src/alohalytics.h"

namespace osm
{
NewFeatureCategories::NewFeatureCategories(editor::EditorConfig const & config)
{
  // TODO(mgsergio): Load types user can create from XML file.
  // TODO: Not every editable type can be created by user.
  // TODO(mgsergio): Store in Settings:: recent history of created types and use them here.
  // Max history items count should be set in the config.
  Classificator const & cl = classif();
  for (auto const & classificatorType : config.GetTypesThatCanBeAdded())
  {
    uint32_t const type = cl.GetTypeByReadableObjectName(classificatorType);
    if (type == 0)
    {
      LOG(LWARNING, ("Unknown type in Editor's config:", classificatorType));
      continue;
    }
    m_types.push_back(type);
  }
}

NewFeatureCategories::NewFeatureCategories(NewFeatureCategories && other)
  : m_index(move(other.m_index))
  , m_types(move(other.m_types))
  , m_categoriesByLang(move(other.m_categoriesByLang))
{
}

void NewFeatureCategories::AddLanguage(string lang)
{
  auto langCode = CategoriesHolder::MapLocaleToInteger(lang);
  if (langCode == CategoriesHolder::kUnsupportedLocaleCode)
  {
    lang = "en";
    langCode = CategoriesHolder::kEnglishCode;
  }
  if (m_categoriesByLang.find(lang) != m_categoriesByLang.end())
    return;

  NewFeatureCategories::TNames names;
  names.reserve(m_types.size());
  for (auto const & type : m_types)
  {
    m_index.AddCategoryByTypeAndLang(type, langCode);
    names.emplace_back(m_index.GetCategoriesHolder()->GetReadableFeatureType(type, langCode), type);
  }
  my::SortUnique(names);
  m_categoriesByLang[lang] = names;
}

NewFeatureCategories::TNames NewFeatureCategories::Search(string const & query, string lang) const
{
  auto langCode = CategoriesHolder::MapLocaleToInteger(lang);
  if (langCode == CategoriesHolder::kUnsupportedLocaleCode)
  {
    lang = "en";
    langCode = CategoriesHolder::kEnglishCode;
  }
  vector<uint32_t> resultTypes;
  m_index.GetAssociatedTypes(query, resultTypes);

  NewFeatureCategories::TNames result(resultTypes.size());
  for (size_t i = 0; i < result.size(); ++i)
  {
    result[i].first =
        m_index.GetCategoriesHolder()->GetReadableFeatureType(resultTypes[i], langCode);
    result[i].second = resultTypes[i];
  }
  my::SortUnique(result);

  alohalytics::TStringMap const stats = {
      {"query", query}, {"lang", lang}};
  alohalytics::LogEvent("searchNewFeatureCategory", stats);

  return result;
}

NewFeatureCategories::TNames const & NewFeatureCategories::GetAllCategoryNames(
    string const & lang) const
{
  auto it = m_categoriesByLang.find(lang);
  if (it == m_categoriesByLang.end())
    it = m_categoriesByLang.find("en");
  CHECK(it != m_categoriesByLang.end(), ());
  return it->second;
}
}  // namespace osm