2016-01-15 02:47:19 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <DB/Dictionaries/Embedded/RegionsHierarchy.h>
|
2017-01-21 04:24:28 +00:00
|
|
|
|
#include <Poco/Exception.h>
|
|
|
|
|
#include <unordered_map>
|
2016-01-15 02:47:19 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Содержит несколько иерархий регионов, загружаемых из нескольких разных файлов.
|
|
|
|
|
* Используется, чтобы поддержать несколько разных точек зрения о принадлежности регионов странам.
|
|
|
|
|
* В первую очередь, для Крыма (Российская и Украинская точки зрения).
|
|
|
|
|
*/
|
|
|
|
|
class RegionsHierarchies
|
|
|
|
|
{
|
|
|
|
|
private:
|
2016-05-28 10:35:44 +00:00
|
|
|
|
using Container = std::unordered_map<std::string, RegionsHierarchy>;
|
2016-01-15 02:47:19 +00:00
|
|
|
|
Container data;
|
|
|
|
|
|
|
|
|
|
public:
|
2017-01-21 04:24:28 +00:00
|
|
|
|
/** path_to_regions_hierarchy_file in configuration file
|
|
|
|
|
* должен указывать на файл с иерархией регионов "по-умолчанию". Она будет доступна по пустому ключу.
|
2016-01-15 02:47:19 +00:00
|
|
|
|
* Кроме того, рядом ищутся файлы, к имени которых (до расширения, если есть) добавлен произвольный _suffix.
|
|
|
|
|
* Такие файлы загружаются, и иерархия регионов кладётся по ключу suffix.
|
|
|
|
|
*
|
|
|
|
|
* Например, если указано /opt/geo/regions_hierarchy.txt,
|
|
|
|
|
* то будет также загружен файл /opt/geo/regions_hierarchy_ua.txt, если такой есть - он будет доступен по ключу ua.
|
|
|
|
|
*/
|
2017-01-21 04:24:28 +00:00
|
|
|
|
RegionsHierarchies();
|
2017-02-07 12:25:18 +00:00
|
|
|
|
explicit RegionsHierarchies(const std::string & path_to_regions_hierarchy_file);
|
2016-01-15 02:47:19 +00:00
|
|
|
|
|
2017-01-21 04:24:28 +00:00
|
|
|
|
/// Has corresponding section in configuration file.
|
|
|
|
|
static bool isConfigured();
|
2016-01-15 02:47:19 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Перезагружает, при необходимости, все иерархии регионов.
|
|
|
|
|
*/
|
|
|
|
|
void reload()
|
|
|
|
|
{
|
|
|
|
|
for (auto & elem : data)
|
|
|
|
|
elem.second.reload();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const RegionsHierarchy & get(const std::string & key) const
|
|
|
|
|
{
|
|
|
|
|
auto it = data.find(key);
|
|
|
|
|
|
|
|
|
|
if (data.end() == it)
|
|
|
|
|
throw Poco::Exception("There is no regions hierarchy for key " + key);
|
|
|
|
|
|
|
|
|
|
return it->second;
|
|
|
|
|
}
|
|
|
|
|
};
|