Generalized flatbuffers response generation in 'Route','Trip','Match' services.

This commit is contained in:
Denis Chaplygin 2019-08-08 19:12:27 +03:00
parent 533f1ffc6b
commit 306c047c14
3 changed files with 40 additions and 51 deletions

View File

@ -46,20 +46,7 @@ class MatchAPI final : public RouteAPI
const std::vector<InternalRouteResult> &sub_routes,
flatbuffers::FlatBufferBuilder &fb_result) const
{
fbresult::FBResultBuilder response(fb_result);
std::vector<flatbuffers::Offset<fbresult::RouteObject>> routes;
routes.reserve(sub_matchings.size());
for (auto index : util::irange<std::size_t>(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<fbresult::Waypoint>>
flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<fbresult::Waypoint>>>
MakeTracepoints(flatbuffers::FlatBufferBuilder &fb_result, const std::vector<map_matching::SubMatching> &sub_matchings) const
{
std::vector<flatbuffers::Offset<fbresult::Waypoint>> 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

View File

@ -42,7 +42,7 @@ public:
: BaseAPI(facade_, parameters_), parameters(parameters_) {
}
virtual void
void
MakeResponse(const InternalManyRoutesResult &raw_routes,
const std::vector<PhantomNodes>
&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<flatbuffers::Offset<fbresult::RouteObject>> 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<PhantomNodes>
@ -123,6 +108,35 @@ public:
}
protected:
template <typename GetWptsFn>
fbresult::FBResultBuilder
MakeFBResponse(const InternalManyRoutesResult &raw_routes,
flatbuffers::FlatBufferBuilder &fb_result,
GetWptsFn getWaypoints) const
{
fbresult::FBResultBuilder response(fb_result);
std::vector<flatbuffers::Offset<fbresult::RouteObject>> 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 <typename BuilderType, typename ForwardIter>
void MakeGeometry(BuilderType builder, ForwardIter begin, ForwardIter end) const
{

View File

@ -45,20 +45,8 @@ class TripAPI final : public RouteAPI
const std::vector<PhantomNode> &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<flatbuffers::Offset<fbresult::RouteObject>> routes;
routes.reserve(sub_trips.size());
for (auto index : util::irange<std::size_t>(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<std::vector<NodeID>> &sub_trips,
@ -102,7 +90,7 @@ class TripAPI final : public RouteAPI
}
};
std::vector<flatbuffers::Offset<fbresult::Waypoint>> MakeWaypoints(flatbuffers::FlatBufferBuilder &fb_result,
flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<fbresult::Waypoint>>> MakeWaypoints(flatbuffers::FlatBufferBuilder &fb_result,
const std::vector<std::vector<NodeID>> &sub_trips,
const std::vector<PhantomNode> &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<std::vector<NodeID>> &sub_trips,