From 18cdbf57f53271c132741e2b5f2c96160bc132fd Mon Sep 17 00:00:00 2001 From: Olga Khlopkova Date: Fri, 24 Jul 2020 17:21:02 +0300 Subject: [PATCH] [transit] (De)serialize links from stop to transfer. --- transit/experimental/transit_data.cpp | 19 ++++++++++++++----- .../transit_types_experimental.cpp | 5 ++++- .../transit_types_experimental.hpp | 6 ++++-- .../parse_transit_from_json_tests.cpp | 6 +++++- .../transit_serdes_tests.cpp | 4 ++-- transit/transit_tests/transit_tools.hpp | 5 +++-- 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/transit/experimental/transit_data.cpp b/transit/experimental/transit_data.cpp index 15290b6dda..b91b192f16 100644 --- a/transit/experimental/transit_data.cpp +++ b/transit/experimental/transit_data.cpp @@ -106,9 +106,17 @@ std::vector GetWeightsFromJson(json_t * obj) return weights; } -IdList GetStopIdsFromJson(json_t * obj) +IdList GetIdListFromJson(json_t * obj, std::string const & field, bool obligatory = true) { - json_t * arr = base::GetJSONObligatoryField(obj, "stops_ids"); + json_t * arr = base::GetJSONOptionalField(obj, field); + if (!arr) + { + if (obligatory) + CHECK(false, ("Obligatory field", field, "is absent.")); + + return {}; + } + CHECK(json_is_array(arr), ()); size_t const count = json_array_size(arr); @@ -303,7 +311,7 @@ void Read(base::Json const & obj, std::vector & lines) ShapeLink const shapeLink = GetShapeLinkFromJson(obj.get()); Translations const title = GetTranslationsFromJson(obj.get(), "title"); - IdList const stopIds = GetStopIdsFromJson(obj.get()); + IdList const stopIds = GetIdListFromJson(obj.get(), "stops_ids"); std::vector const intervals = GetIntervalsFromJson(obj.get()); @@ -321,8 +329,9 @@ void Read(base::Json const & obj, std::vector & stops, OsmIdToFeatureIdsMa Translations const title = GetTranslationsFromJson(obj.get(), "title"); TimeTable const timetable = GetTimeTableFromJson(obj.get()); m2::PointD const point = GetPointFromJson(base::GetJSONObligatoryField(obj.get(), "point")); + IdList const & transferIds = GetIdListFromJson(obj.get(), "transfer_ids", false /* obligatory */); - stops.emplace_back(id, featureId, osmId, title, timetable, point); + stops.emplace_back(id, featureId, osmId, title, timetable, point, transferIds); } void Read(base::Json const & obj, std::vector & shapes) @@ -364,7 +373,7 @@ void Read(base::Json const & obj, std::vector & transfers) { TransitId const id = GetIdFromJson(obj.get()); m2::PointD const point = GetPointFromJson(base::GetJSONObligatoryField(obj.get(), "point")); - IdList const stopIds = GetStopIdsFromJson(obj.get()); + IdList const stopIds = GetIdListFromJson(obj.get(), "stops_ids"); transfers.emplace_back(id, point, stopIds); } diff --git a/transit/experimental/transit_types_experimental.cpp b/transit/experimental/transit_types_experimental.cpp index 5a3619c994..9753ecfbf5 100644 --- a/transit/experimental/transit_types_experimental.cpp +++ b/transit/experimental/transit_types_experimental.cpp @@ -178,12 +178,13 @@ osmoh::OpeningHours Line::GetServiceDays() const { return m_serviceDays; } Stop::Stop() : m_ids(true /* serializeFeatureIdOnly */) {} Stop::Stop(TransitId id, FeatureId featureId, OsmId osmId, Translations const & title, - TimeTable const & timetable, m2::PointD const & point) + TimeTable const & timetable, m2::PointD const & point, IdList const & transferIds) : m_id(id) , m_ids(featureId, osmId, true /* serializeFeatureIdOnly */) , m_title(title) , m_timetable(timetable) , m_point(point) + , m_transferIds(transferIds) { } @@ -222,6 +223,8 @@ TimeTable const & Stop::GetTimeTable() const { return m_timetable; } m2::PointD const & Stop::GetPoint() const { return m_point; } +IdList const & Stop::GetTransferIds() const { return m_transferIds; } + void Stop::SetBestPedestrianSegments(std::vector const & seg) { m_bestPedestrianSegments = seg; diff --git a/transit/experimental/transit_types_experimental.hpp b/transit/experimental/transit_types_experimental.hpp index f570b26066..b31b64b177 100644 --- a/transit/experimental/transit_types_experimental.hpp +++ b/transit/experimental/transit_types_experimental.hpp @@ -234,7 +234,7 @@ class Stop public: Stop(); Stop(TransitId id, FeatureId featureId, OsmId osmId, Translations const & title, - TimeTable const & timetable, m2::PointD const & point); + TimeTable const & timetable, m2::PointD const & point, IdList const & transferIds); explicit Stop(TransitId id); bool operator<(Stop const & rhs) const; @@ -251,13 +251,14 @@ public: std::string GetTitle() const; TimeTable const & GetTimeTable() const; m2::PointD const & GetPoint() const; + IdList const & GetTransferIds() const; private: DECLARE_TRANSIT_TYPES_FRIENDS DECLARE_VISITOR_AND_DEBUG_PRINT(Stop, visitor(m_id, "id"), visitor(m_ids, "id_bundle"), visitor(m_bestPedestrianSegments, "best_pedestrian_segments"), visitor(m_title, "title"), visitor(m_timetable, "timetable"), - visitor(m_point, "point")) + visitor(m_point, "point"), visitor(m_transferIds, "transfer_ids")) TransitId m_id = kInvalidTransitId; IdBundle m_ids; // |m_bestPedestrianSegments| are segments which can be used for pedestrian routing to leave and @@ -267,6 +268,7 @@ private: Translations m_title; TimeTable m_timetable; m2::PointD m_point; + IdList m_transferIds; }; class Gate diff --git a/transit/transit_experimental_tests/parse_transit_from_json_tests.cpp b/transit/transit_experimental_tests/parse_transit_from_json_tests.cpp index 83d1e306f5..240820a9f8 100644 --- a/transit/transit_experimental_tests/parse_transit_from_json_tests.cpp +++ b/transit/transit_experimental_tests/parse_transit_from_json_tests.cpp @@ -174,6 +174,10 @@ UNIT_TEST(ReadJson_Stop) "line_id":4036591562, "arrivals":"15:23-15:23 open" } + ], + "transfer_ids":[ + 4036593809, + 4036595406 ] })"}; @@ -182,7 +186,7 @@ UNIT_TEST(ReadJson_Stop) Translations{{"default", "Balfour Rd & Foothill Dr"}}, TimeTable{{4036591493, osmoh::OpeningHours("13:23-13:23 open")}, {4036591562, osmoh::OpeningHours("15:23-15:23 open")}}, - m2::PointD(-121.74124, 41.04276))}; + m2::PointD(-121.74124, 41.04276), {4036593809, 4036595406} /* transferIds */)}; std::vector stopsFact; diff --git a/transit/transit_experimental_tests/transit_serdes_tests.cpp b/transit/transit_experimental_tests/transit_serdes_tests.cpp index b3015c8fd3..b96a6d21a5 100644 --- a/transit/transit_experimental_tests/transit_serdes_tests.cpp +++ b/transit/transit_experimental_tests/transit_serdes_tests.cpp @@ -152,10 +152,10 @@ TransitData FillTestTransitData() {4026636458, osmoh::OpeningHours("05:00-05:00 open")}, {4026636458, osmoh::OpeningHours("05:30-05:30 open")}, {4026952369, osmoh::OpeningHours("15:30-15:30 open")}}, - m2::PointD(-58.57196, -36.82596)), + m2::PointD(-58.57196, -36.82596), {} /* transferIds */), Stop(4026990854 /* id */, kInvalidFeatureId /* featureId */, kInvalidOsmId /* osmId */, Translations{{"default", "QUIROGA 1901-1999"}}, - TimeTable{}, m2::PointD(-58.57196, -36.82967))}; + TimeTable{}, m2::PointD(-58.57196, -36.82967), {} /* transferIds */)}; data.SetStopPedestrianSegments( 0 /* stopIdx */, diff --git a/transit/transit_tests/transit_tools.hpp b/transit/transit_tests/transit_tools.hpp index d2f7e11261..ef83e27403 100644 --- a/transit/transit_tests/transit_tools.hpp +++ b/transit/transit_tests/transit_tools.hpp @@ -60,9 +60,10 @@ inline bool Equal(Line const & l1, Line const & l2) inline bool Equal(Stop const & s1, Stop const & s2) { return (std::make_tuple(s1.GetId(), s1.GetFeatureId(), s1.GetOsmId(), s1.GetTitle(), - s1.GetTimeTable(), s1.GetBestPedestrianSegments()) == + s1.GetTimeTable(), s1.GetTransferIds(), s1.GetBestPedestrianSegments()) == std::make_tuple(s2.GetId(), s2.GetFeatureId(), s2.GetOsmId(), s2.GetTitle(), - s2.GetTimeTable(), s2.GetBestPedestrianSegments())) && + s2.GetTimeTable(), s2.GetTransferIds(), + s2.GetBestPedestrianSegments())) && base::AlmostEqualAbs(s1.GetPoint(), s2.GetPoint(), kPointsEqualEpsilon); }