From a4919ffb454400a68812ed1e036c5297738edd14 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Mon, 5 Jan 2015 12:59:29 +0100 Subject: [PATCH] re-enable hintin mechanism --- data_structures/phantom_node.hpp | 5 ++++- descriptors/json_descriptor.hpp | 26 +++++++++++++------------- plugins/distance_table.hpp | 13 ++++++++++++- plugins/viaroute.hpp | 11 +++++++++++ 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/data_structures/phantom_node.hpp b/data_structures/phantom_node.hpp index c30ebed3b..56393e323 100644 --- a/data_structures/phantom_node.hpp +++ b/data_structures/phantom_node.hpp @@ -86,7 +86,10 @@ struct PhantomNode using PhantomNodeArray = std::vector>; -using phantom_node_pair = std::pair; +class phantom_node_pair : public std::pair +{ + +}; struct PhantomNodeLists { diff --git a/descriptors/json_descriptor.hpp b/descriptors/json_descriptor.hpp index 94efcd14c..2aae939a9 100644 --- a/descriptors/json_descriptor.hpp +++ b/descriptors/json_descriptor.hpp @@ -279,19 +279,19 @@ template class JSONDescriptor final : public BaseDescriptor< json_result.values["alternative_names"] = json_alternate_names_array; } - // JSON::Object json_hint_object; - // json_hint_object.values["checksum"] = facade->GetCheckSum(); - // JSON::Array json_location_hint_array; - // std::string hint; - // for (const auto i : osrm::irange(0, raw_route.segment_end_coordinates.size())) - // { - // ObjectEncoder::EncodeToBase64(raw_route.segment_end_coordinates[i].source_phantom, hint); - // json_location_hint_array.values.push_back(hint); - // } - // ObjectEncoder::EncodeToBase64(raw_route.segment_end_coordinates.back().target_phantom, hint); - // json_location_hint_array.values.push_back(hint); - // json_hint_object.values["locations"] = json_location_hint_array; - // json_result.values["hint_data"] = json_hint_object; + JSON::Object json_hint_object; + json_hint_object.values["checksum"] = facade->GetCheckSum(); + JSON::Array json_location_hint_array; + std::string hint; + for (const auto i : osrm::irange(0, raw_route.segment_end_coordinates.size())) + { + ObjectEncoder::EncodeToBase64(raw_route.segment_end_coordinates[i].source_phantom, hint); + json_location_hint_array.values.push_back(hint); + } + ObjectEncoder::EncodeToBase64(raw_route.segment_end_coordinates.back().target_phantom, hint); + json_location_hint_array.values.push_back(hint); + json_hint_object.values["locations"] = json_location_hint_array; + json_result.values["hint_data"] = json_hint_object; // render the content to the output array TIMER_START(route_render); diff --git a/plugins/distance_table.hpp b/plugins/distance_table.hpp index e28dada82..6ef90a5b8 100644 --- a/plugins/distance_table.hpp +++ b/plugins/distance_table.hpp @@ -71,12 +71,23 @@ template class DistanceTablePlugin final : public BasePlugin return; } - // const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum()); + const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum()); unsigned max_locations = std::min(100u, static_cast(route_parameters.coordinates.size())); PhantomNodeArray phantom_node_vector(max_locations); for (const auto i : osrm::irange(0u, max_locations)) { + if (checksum_OK && i < route_parameters.hints.size() && + !route_parameters.hints[i].empty()) + { + PhantomNode current_phantom_node; + ObjectEncoder::DecodeFromBase64(route_parameters.hints[i], current_phantom_node); + if (current_phantom_node.is_valid(facade->GetNumberOfNodes())) + { + phantom_node_vector[i].emplace_back(std::move(current_phantom_node)); + continue; + } + } facade->IncrementalFindPhantomNodeForCoordinate(route_parameters.coordinates[i], phantom_node_vector[i], 1); diff --git a/plugins/viaroute.hpp b/plugins/viaroute.hpp index b93add0d7..236ee395a 100644 --- a/plugins/viaroute.hpp +++ b/plugins/viaroute.hpp @@ -79,9 +79,20 @@ template class ViaRoutePlugin final : public BasePlugin reply.status = http::Reply::ok; std::vector phantom_node_pair_list(route_parameters.coordinates.size()); + const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum()); for (const auto i : osrm::irange(0, route_parameters.coordinates.size())) { + if (checksum_OK && i < route_parameters.hints.size() && + !route_parameters.hints[i].empty()) + { + ObjectEncoder::DecodeFromBase64(route_parameters.hints[i], + phantom_node_pair_list[i]); + if (phantom_node_pair_list[i].first.is_valid(facade->GetNumberOfNodes())) + { + continue; + } + } std::vector phantom_node_vector; if (facade->IncrementalFindPhantomNodeForCoordinate(route_parameters.coordinates[i], phantom_node_vector, 1))