Optimizing FB schema:
* Replaced Response union with nullable fields * "Ok" code replaced with a boolean and a separate structure for a error code and message. * Inlined geometry, thus removing one layer of indirection.
This commit is contained in:
parent
affa8a4653
commit
13287d9970
@ -6,17 +6,18 @@ include "trip.fbs";
|
|||||||
|
|
||||||
namespace osrm.engine.api.fbresult;
|
namespace osrm.engine.api.fbresult;
|
||||||
|
|
||||||
union ServiceResponse {
|
table Error {
|
||||||
match: Match,
|
code: string;
|
||||||
nearest: Nearest,
|
message: string;
|
||||||
route: Route,
|
|
||||||
table: Table,
|
|
||||||
trip: Trip
|
|
||||||
}
|
}
|
||||||
|
|
||||||
table FBResult {
|
table FBResult {
|
||||||
code: string;
|
error: bool = false;
|
||||||
message: string;
|
code: Error;
|
||||||
data_version: string;
|
data_version: string;
|
||||||
response: ServiceResponse;
|
match: Match;
|
||||||
|
nearest: Nearest;
|
||||||
|
route: Route;
|
||||||
|
table: Table;
|
||||||
|
trip: Trip;
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
@ -70,16 +70,11 @@ table Intersection {
|
|||||||
lanes: [Lane];
|
lanes: [Lane];
|
||||||
}
|
}
|
||||||
|
|
||||||
table Geometry {
|
|
||||||
polyline: string;
|
|
||||||
polyline6: string;
|
|
||||||
coordinates: [Position];
|
|
||||||
}
|
|
||||||
|
|
||||||
table Step {
|
table Step {
|
||||||
distance: double;
|
distance: double;
|
||||||
duration: double;
|
duration: double;
|
||||||
geometry: Geometry;
|
polyline: string;
|
||||||
|
coordinates: [Position];
|
||||||
weight: double;
|
weight: double;
|
||||||
name: string;
|
name: string;
|
||||||
ref: string;
|
ref: string;
|
||||||
@ -109,7 +104,8 @@ table RouteObject {
|
|||||||
weight: double;
|
weight: double;
|
||||||
weight_name: string;
|
weight_name: string;
|
||||||
confidence: double; //Used only by 'Match' service
|
confidence: double; //Used only by 'Match' service
|
||||||
geometry: Geometry;
|
polyline: string;
|
||||||
|
coordinates: [Position];
|
||||||
legs: [Leg];
|
legs: [Leg];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,8 +48,6 @@ class NearestAPI final : public BaseAPI
|
|||||||
flatbuffers::FlatBufferBuilder &fb_result) const
|
flatbuffers::FlatBufferBuilder &fb_result) const
|
||||||
{
|
{
|
||||||
fbresult::FBResultBuilder response(fb_result);
|
fbresult::FBResultBuilder response(fb_result);
|
||||||
response.add_code(fb_result.CreateString("Ok"));
|
|
||||||
response.add_response_type(osrm::engine::api::fbresult::ServiceResponse::ServiceResponse_nearest);
|
|
||||||
|
|
||||||
fbresult::NearestBuilder nearest(fb_result);
|
fbresult::NearestBuilder nearest(fb_result);
|
||||||
std::vector<flatbuffers::Offset<fbresult::Waypoint>> waypoints;
|
std::vector<flatbuffers::Offset<fbresult::Waypoint>> waypoints;
|
||||||
@ -72,6 +70,7 @@ class NearestAPI final : public BaseAPI
|
|||||||
|
|
||||||
auto waypoints_vector = fb_result.CreateVector(waypoints);
|
auto waypoints_vector = fb_result.CreateVector(waypoints);
|
||||||
nearest.add_waypoints(waypoints_vector);
|
nearest.add_waypoints(waypoints_vector);
|
||||||
|
response.add_nearest(nearest.Finish());
|
||||||
fb_result.Finish(response.Finish());
|
fb_result.Finish(response.Finish());
|
||||||
}
|
}
|
||||||
void MakeResponse(const std::vector<std::vector<PhantomNodeWithDistance>> &phantom_nodes,
|
void MakeResponse(const std::vector<std::vector<PhantomNodeWithDistance>> &phantom_nodes,
|
||||||
|
@ -66,8 +66,6 @@ public:
|
|||||||
{
|
{
|
||||||
|
|
||||||
fbresult::FBResultBuilder response(fb_result);
|
fbresult::FBResultBuilder response(fb_result);
|
||||||
response.add_code(fb_result.CreateString("Ok"));
|
|
||||||
response.add_response_type(osrm::engine::api::fbresult::ServiceResponse::ServiceResponse_route);
|
|
||||||
|
|
||||||
fbresult::RouteBuilder route(fb_result);
|
fbresult::RouteBuilder route(fb_result);
|
||||||
std::vector<flatbuffers::Offset<fbresult::RouteObject>> routes;
|
std::vector<flatbuffers::Offset<fbresult::RouteObject>> routes;
|
||||||
@ -86,7 +84,7 @@ public:
|
|||||||
auto routes_vector = fb_result.CreateVector(routes);
|
auto routes_vector = fb_result.CreateVector(routes);
|
||||||
route.add_routes(routes_vector);
|
route.add_routes(routes_vector);
|
||||||
route.add_waypoints(BaseAPI::MakeWaypoints(fb_result, all_start_end_points));
|
route.add_waypoints(BaseAPI::MakeWaypoints(fb_result, all_start_end_points));
|
||||||
response.add_response(route.Finish().Union());
|
response.add_route(route.Finish());
|
||||||
|
|
||||||
auto data_timestamp = facade.GetTimestamp();
|
auto data_timestamp = facade.GetTimestamp();
|
||||||
if (!data_timestamp.empty())
|
if (!data_timestamp.empty())
|
||||||
@ -127,16 +125,15 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
template <typename ForwardIter>
|
template <typename BuilderType, typename ForwardIter>
|
||||||
flatbuffers::Offset<fbresult::Geometry> MakeGeometry(flatbuffers::FlatBufferBuilder& builder, ForwardIter begin, ForwardIter end) const
|
void MakeGeometry(BuilderType builder, ForwardIter begin, ForwardIter end) const
|
||||||
{
|
{
|
||||||
fbresult::GeometryBuilder geometry(builder);
|
|
||||||
if (parameters.geometries == RouteParameters::GeometriesType::Polyline) {
|
if (parameters.geometries == RouteParameters::GeometriesType::Polyline) {
|
||||||
auto polyline_string = builder.CreateString(encodePolyline<100000>(begin, end));
|
auto polyline_string = builder.fbb_.CreateString(encodePolyline<100000>(begin, end));
|
||||||
geometry.add_polyline(polyline_string);
|
builder.add_polyline(polyline_string);
|
||||||
} else if (parameters.geometries == RouteParameters::GeometriesType::Polyline6) {
|
} else if (parameters.geometries == RouteParameters::GeometriesType::Polyline6) {
|
||||||
auto polyline_string = builder.CreateString(encodePolyline<1000000>(begin, end));
|
auto polyline_string = builder.fbb_.CreateString(encodePolyline<1000000>(begin, end));
|
||||||
geometry.add_polyline6(polyline_string);
|
builder.add_polyline(polyline_string);
|
||||||
} else {
|
} else {
|
||||||
std::vector<fbresult::Position> coordinates;
|
std::vector<fbresult::Position> coordinates;
|
||||||
coordinates.resize(std::distance(begin, end));
|
coordinates.resize(std::distance(begin, end));
|
||||||
@ -144,10 +141,9 @@ public:
|
|||||||
return fbresult::Position{static_cast<double>(util::toFloating(c.lon)),
|
return fbresult::Position{static_cast<double>(util::toFloating(c.lon)),
|
||||||
static_cast<double>(util::toFloating(c.lat))};
|
static_cast<double>(util::toFloating(c.lat))};
|
||||||
});
|
});
|
||||||
auto coordinates_vector = builder.CreateVectorOfStructs(coordinates);
|
auto coordinates_vector = builder.fbb_.CreateVectorOfStructs(coordinates);
|
||||||
geometry.add_coordinates(coordinates_vector);
|
builder.add_coordinates(coordinates_vector);
|
||||||
}
|
}
|
||||||
return geometry.Finish();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::optional<util::json::Value> MakeGeometry(boost::optional<std::vector<Coordinate>>&& annotations) const
|
boost::optional<util::json::Value> MakeGeometry(boost::optional<std::vector<Coordinate>>&& annotations) const
|
||||||
@ -304,8 +300,7 @@ public:
|
|||||||
//Fill geometry
|
//Fill geometry
|
||||||
auto overview = MakeOverview(leg_geometries);
|
auto overview = MakeOverview(leg_geometries);
|
||||||
if(overview) {
|
if(overview) {
|
||||||
auto geometry = MakeGeometry(fb_result, overview->begin(), overview->end());
|
MakeGeometry(routeObject, overview->begin(), overview->end());
|
||||||
routeObject.add_geometry(geometry);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Fill legs
|
//Fill legs
|
||||||
@ -363,8 +358,7 @@ public:
|
|||||||
stepBuilder.add_driving_side(step.is_left_hand_driving);
|
stepBuilder.add_driving_side(step.is_left_hand_driving);
|
||||||
|
|
||||||
//Geometry
|
//Geometry
|
||||||
auto geometry = MakeGeometry(fb_result, leg_geometry.locations.begin() + step.geometry_begin, leg_geometry.locations.begin() + step.geometry_end);
|
MakeGeometry(stepBuilder, leg_geometry.locations.begin() + step.geometry_begin, leg_geometry.locations.begin() + step.geometry_end);
|
||||||
stepBuilder.add_geometry(geometry);
|
|
||||||
//Maneuver
|
//Maneuver
|
||||||
fbresult::StepManeuverBuilder maneuver(fb_result);
|
fbresult::StepManeuverBuilder maneuver(fb_result);
|
||||||
fbresult::Position maneuverPosition{static_cast<double>(util::toFloating(step.maneuver.location.lon)),
|
fbresult::Position maneuverPosition{static_cast<double>(util::toFloating(step.maneuver.location.lon)),
|
||||||
|
@ -71,8 +71,6 @@ class TableAPI final : public BaseAPI
|
|||||||
auto number_of_destinations = parameters.destinations.size();
|
auto number_of_destinations = parameters.destinations.size();
|
||||||
|
|
||||||
fbresult::FBResultBuilder response(fb_result);
|
fbresult::FBResultBuilder response(fb_result);
|
||||||
response.add_code(fb_result.CreateString("Ok"));
|
|
||||||
response.add_response_type(osrm::engine::api::fbresult::ServiceResponse::ServiceResponse_table);
|
|
||||||
|
|
||||||
fbresult::TableBuilder table(fb_result);
|
fbresult::TableBuilder table(fb_result);
|
||||||
|
|
||||||
@ -113,7 +111,7 @@ class TableAPI final : public BaseAPI
|
|||||||
{
|
{
|
||||||
table.add_fallback_speed_cells(MakeEstimatesTable(fb_result, fallback_speed_cells));
|
table.add_fallback_speed_cells(MakeEstimatesTable(fb_result, fallback_speed_cells));
|
||||||
}
|
}
|
||||||
|
response.add_table(table.Finish());
|
||||||
fb_result.Finish(response.Finish());
|
fb_result.Finish(response.Finish());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,10 +75,13 @@ class BasePlugin
|
|||||||
json_result.values["message"] = message;
|
json_result.values["message"] = message;
|
||||||
};
|
};
|
||||||
void operator()(flatbuffers::FlatBufferBuilder& fb_result) {
|
void operator()(flatbuffers::FlatBufferBuilder& fb_result) {
|
||||||
osrm::engine::api::fbresult::FBResultBuilder error(fb_result);
|
api::fbresult::FBResultBuilder error(fb_result);
|
||||||
error.add_code(fb_result.CreateString(code));
|
error.add_error(true);
|
||||||
error.add_message(fb_result.CreateString(message));
|
|
||||||
error.add_response_type(osrm::engine::api::fbresult::ServiceResponse::ServiceResponse_NONE);
|
api::fbresult::ErrorBuilder codeBuilder(fb_result);
|
||||||
|
codeBuilder.add_code(fb_result.CreateString(code));
|
||||||
|
codeBuilder.add_message(fb_result.CreateString(message));
|
||||||
|
error.add_code(codeBuilder.Finish());
|
||||||
fb_result.Finish(error.Finish());
|
fb_result.Finish(error.Finish());
|
||||||
};
|
};
|
||||||
void operator()(std::string& str_result) {
|
void operator()(std::string& str_result) {
|
||||||
|
Loading…
Reference in New Issue
Block a user