From 306c047c143bf343619b0e7b48fff29a6e2c51d0 Mon Sep 17 00:00:00 2001 From: Denis Chaplygin Date: Thu, 8 Aug 2019 19:12:27 +0300 Subject: [PATCH] Generalized flatbuffers response generation in 'Route','Trip','Match' services. --- include/engine/api/match_api.hpp | 19 ++--------- include/engine/api/route_api.hpp | 54 ++++++++++++++++++++------------ include/engine/api/trip_api.hpp | 18 ++--------- 3 files changed, 40 insertions(+), 51 deletions(-) diff --git a/include/engine/api/match_api.hpp b/include/engine/api/match_api.hpp index d31398b08..8f1328239 100644 --- a/include/engine/api/match_api.hpp +++ b/include/engine/api/match_api.hpp @@ -46,20 +46,7 @@ class MatchAPI final : public RouteAPI const std::vector &sub_routes, flatbuffers::FlatBufferBuilder &fb_result) const { - fbresult::FBResultBuilder response(fb_result); - - std::vector> routes; - routes.reserve(sub_matchings.size()); - for (auto index : util::irange(0UL, sub_matchings.size())) - { - routes.push_back(MakeRoute(fb_result, - sub_routes[index].segment_end_coordinates, - sub_routes[index].unpacked_path_segments, - sub_routes[index].source_traversed_in_reverse, - sub_routes[index].target_traversed_in_reverse)); - } - response.add_routes(fb_result.CreateVector(routes)); - response.add_waypoints(fb_result.CreateVector(MakeTracepoints(fb_result, sub_matchings))); + auto response = MakeFBResponse(sub_routes, fb_result, [this, &fb_result, &sub_matchings]() { return MakeTracepoints(fb_result, sub_matchings); }); fb_result.Finish(response.Finish()); } @@ -106,7 +93,7 @@ class MatchAPI final : public RouteAPI } }; - std::vector> + flatbuffers::Offset>> MakeTracepoints(flatbuffers::FlatBufferBuilder &fb_result, const std::vector &sub_matchings) const { std::vector> waypoints; @@ -156,7 +143,7 @@ class MatchAPI final : public RouteAPI waypoints.push_back(waypoint.Finish()); } - return waypoints; + return fb_result.CreateVector(waypoints); } util::json::Array diff --git a/include/engine/api/route_api.hpp b/include/engine/api/route_api.hpp index e819dd0a3..9249afc95 100644 --- a/include/engine/api/route_api.hpp +++ b/include/engine/api/route_api.hpp @@ -42,7 +42,7 @@ public: : BaseAPI(facade_, parameters_), parameters(parameters_) { } - virtual void + void MakeResponse(const InternalManyRoutesResult &raw_routes, const std::vector &all_start_end_points, // all used coordinates, ignoring waypoints= parameter @@ -64,25 +64,9 @@ public: &all_start_end_points, // all used coordinates, ignoring waypoints= parameter flatbuffers::FlatBufferBuilder &fb_result) const { - - fbresult::FBResultBuilder response(fb_result); - - std::vector> routes; - for (const auto &raw_route : raw_routes.routes) - { - if (!raw_route.is_valid()) - continue; - - routes.push_back(MakeRoute(fb_result, - raw_route.segment_end_coordinates, - raw_route.unpacked_path_segments, - raw_route.source_traversed_in_reverse, - raw_route.target_traversed_in_reverse)); - } - - auto routes_vector = fb_result.CreateVector(routes); - response.add_routes(routes_vector); - response.add_waypoints(BaseAPI::MakeWaypoints(fb_result, all_start_end_points)); + auto response = MakeFBResponse(raw_routes, fb_result, [this, &all_start_end_points, &fb_result]() { + return BaseAPI::MakeWaypoints(fb_result, all_start_end_points); + }); auto data_timestamp = facade.GetTimestamp(); if (!data_timestamp.empty()) @@ -93,6 +77,7 @@ public: fb_result.Finish(response.Finish()); } + void MakeResponse(const InternalManyRoutesResult &raw_routes, const std::vector @@ -123,6 +108,35 @@ public: } protected: + template + fbresult::FBResultBuilder + MakeFBResponse(const InternalManyRoutesResult &raw_routes, + flatbuffers::FlatBufferBuilder &fb_result, + GetWptsFn getWaypoints) const + { + + fbresult::FBResultBuilder response(fb_result); + + std::vector> routes; + for (const auto &raw_route : raw_routes.routes) + { + if (!raw_route.is_valid()) + continue; + + routes.push_back(MakeRoute(fb_result, + raw_route.segment_end_coordinates, + raw_route.unpacked_path_segments, + raw_route.source_traversed_in_reverse, + raw_route.target_traversed_in_reverse)); + } + + auto routes_vector = fb_result.CreateVector(routes); + response.add_routes(routes_vector); + response.add_waypoints(getWaypoints()); + + return response; + } + template void MakeGeometry(BuilderType builder, ForwardIter begin, ForwardIter end) const { diff --git a/include/engine/api/trip_api.hpp b/include/engine/api/trip_api.hpp index 02aa00ad2..ed3f0bf3b 100644 --- a/include/engine/api/trip_api.hpp +++ b/include/engine/api/trip_api.hpp @@ -45,20 +45,8 @@ class TripAPI final : public RouteAPI const std::vector &phantoms, flatbuffers::FlatBufferBuilder &fb_result) const { - fbresult::FBResultBuilder response(fb_result); + auto response = MakeFBResponse(sub_routes, fb_result, [this, &fb_result, &sub_trips, &phantoms]() { return MakeWaypoints(fb_result, sub_trips, phantoms); }); - std::vector> routes; - routes.reserve(sub_trips.size()); - for (auto index : util::irange(0UL, sub_trips.size())) - { - routes.push_back(MakeRoute(fb_result, - sub_routes[index].segment_end_coordinates, - sub_routes[index].unpacked_path_segments, - sub_routes[index].source_traversed_in_reverse, - sub_routes[index].target_traversed_in_reverse)); - } - response.add_routes(fb_result.CreateVector(routes)); - response.add_waypoints(fb_result.CreateVector(MakeWaypoints(fb_result, sub_trips, phantoms))); fb_result.Finish(response.Finish()); } void MakeResponse(const std::vector> &sub_trips, @@ -102,7 +90,7 @@ class TripAPI final : public RouteAPI } }; - std::vector> MakeWaypoints(flatbuffers::FlatBufferBuilder &fb_result, + flatbuffers::Offset>> MakeWaypoints(flatbuffers::FlatBufferBuilder &fb_result, const std::vector> &sub_trips, const std::vector &phantoms) const { @@ -122,7 +110,7 @@ class TripAPI final : public RouteAPI waypoints.push_back(waypoint.Finish()); } - return waypoints; + return fb_result.CreateVector(waypoints); } util::json::Array MakeWaypoints(const std::vector> &sub_trips,