From ebf94896845e189fc9fbab187eb88b2f2b233324 Mon Sep 17 00:00:00 2001 From: Sergey Yershov Date: Fri, 12 Dec 2014 16:00:53 +0300 Subject: [PATCH] Add read/write temporary feature state with additional info --- generator/feature_builder.cpp | 6 ++--- generator/feature_builder.hpp | 2 +- generator/osm2type.cpp | 39 +++++++++++++++++++++++++++++++ indexer/feature_data.cpp | 14 +++++++++++ indexer/feature_data.hpp | 44 +++++++++++++++++++++++++++++++++-- 5 files changed, 99 insertions(+), 6 deletions(-) diff --git a/generator/feature_builder.cpp b/generator/feature_builder.cpp index de89683db6..3c749e0c6c 100644 --- a/generator/feature_builder.cpp +++ b/generator/feature_builder.cpp @@ -322,11 +322,11 @@ bool FeatureBuilder1::CheckValid() const return true; } -void FeatureBuilder1::SerializeBase(buffer_t & data, serial::CodingParams const & params) const +void FeatureBuilder1::SerializeBase(buffer_t & data, serial::CodingParams const & params, bool need_serialize_additional_info) const { PushBackByteSink sink(data); - m_params.Write(sink); + m_params.Write(sink, need_serialize_additional_info); if (m_params.GetGeomType() == GEOM_POINT) serial::SavePoint(sink, m_center, params); @@ -543,7 +543,7 @@ void FeatureBuilder2::Serialize(buffers_holder_t & data, serial::CodingParams co data.m_buffer.clear(); // header data serialization - SerializeBase(data.m_buffer, params); + SerializeBase(data.m_buffer, params, false /* don't store additional info from FeatureParams*/); PushBackByteSink sink(data.m_buffer); diff --git a/generator/feature_builder.hpp b/generator/feature_builder.hpp index 6c1a25fd9e..4c8f413177 100644 --- a/generator/feature_builder.hpp +++ b/generator/feature_builder.hpp @@ -67,7 +67,7 @@ public: /// @name Serialization. //@{ void Serialize(buffer_t & data) const; - void SerializeBase(buffer_t & data, serial::CodingParams const & params) const; + void SerializeBase(buffer_t & data, serial::CodingParams const & params, bool need_searialize_additional_info = true) const; void Deserialize(buffer_t & data); //@} diff --git a/generator/osm2type.cpp b/generator/osm2type.cpp index 3a2ba86b9f..177c3259f8 100644 --- a/generator/osm2type.cpp +++ b/generator/osm2type.cpp @@ -101,6 +101,44 @@ namespace ftype } }; + class do_find_additional_info + { + size_t & m_count; + FeatureParams & m_params; + + public: + typedef bool result_type; + + do_find_additional_info(size_t &count, FeatureParams ¶ms) + : m_count(count), m_params(params) + { + m_count = 0; + } + + bool operator() (string const & k, string const & v) + { + ++m_count; + + if (v.empty()) + return false; + + if (k == "cuisine") + { + m_params.AddAdditionalInfo(FeatureParams::ait_cuisine, v); + } + else if (k == "phone") + { + m_params.AddAdditionalInfo(FeatureParams::ait_phone_number, v); + } + else if (k == "opening_hours") + { + m_params.AddAdditionalInfo(FeatureParams::ait_open_hours, v); + } + return false; + } + + }; + class do_find_name { set m_savedNames; @@ -359,6 +397,7 @@ namespace ftype { size_t count; for_each_tag(p, do_find_name(count, params)); + for_each_tag(p, do_find_additional_info(count, params)); return count; } diff --git a/indexer/feature_data.cpp b/indexer/feature_data.cpp index fae0aa29b3..586c548691 100644 --- a/indexer/feature_data.cpp +++ b/indexer/feature_data.cpp @@ -168,6 +168,20 @@ bool FeatureParams::AddHouseName(string const & s) return false; } +bool FeatureParams::AddAdditionalInfo(additional_info_types type, string const &s) +{ + if (m_additional_info[type].empty()) + { + m_additional_info[type] = s; + } + else + { + m_additional_info[type] = m_additional_info[type] + ", " + s; + } + return true; +} + + bool FeatureParams::AddHouseNumber(string const & ss) { if (!feature::IsHouseNumber(ss)) diff --git a/indexer/feature_data.hpp b/indexer/feature_data.hpp index 798da16241..4224e80380 100644 --- a/indexer/feature_data.hpp +++ b/indexer/feature_data.hpp @@ -206,6 +206,16 @@ class FeatureParams : public FeatureParamsBase string m_street; public: + + enum additional_info_types { + ait_cuisine = 1, + ait_open_hours, + ait_phone_number, + ait_fax_number + }; + typedef std::map additional_info_type; + additional_info_type m_additional_info; + typedef vector types_t; types_t m_Types; @@ -216,6 +226,9 @@ public: bool AddName(string const & lang, string const & s); bool AddHouseName(string const & s); bool AddHouseNumber(string const & s); + + bool AddAdditionalInfo(additional_info_types type,string const &s); + /// @name Used in storing full street address only. //@{ void AddStreetAddress(string const & s); @@ -230,6 +243,7 @@ public: m_Types = rhs.m_Types; m_street = rhs.m_street; + m_additional_info = rhs.m_additional_info; } inline bool IsValid() const { return !m_Types.empty(); } @@ -255,7 +269,7 @@ public: uint8_t GetHeader() const; - template void Write(TSink & sink) const + template void Write(TSink & sink, bool need_store_additional_info = true) const { uint8_t const header = GetHeader(); @@ -264,10 +278,24 @@ public: for (size_t i = 0; i < m_Types.size(); ++i) WriteVarUint(sink, GetIndexForType(m_Types[i])); + if( need_store_additional_info ) + { + uint8_t const ait_size = m_additional_info.size(); + WriteToSink(sink, ait_size); + if (ait_size) + { + for(auto &it: m_additional_info) + { + WriteToSink(sink, uint8_t(it.first)); + utils::WriteString(sink, it.second); + } + } + } + BaseT::Write(sink, header); } - template void Read(TSrc & src) + template void Read(TSrc & src, bool need_read_additional_info = true) { using namespace feature; @@ -278,6 +306,18 @@ public: for (size_t i = 0; i < count; ++i) m_Types.push_back(GetTypeForIndex(ReadVarUint(src))); + if( need_read_additional_info ) + { + uint8_t const ait_size = ReadPrimitiveFromSource(src); + for(size_t i=0; i(src); + std::string value; + utils::ReadString(src, value); + m_additional_info.insert(make_pair(key, value)); + } + } + BaseT::Read(src, header); }