diff --git a/include/engine/api/route_parameters.hpp b/include/engine/api/route_parameters.hpp index 70c79ca1f..e6f63c5e3 100644 --- a/include/engine/api/route_parameters.hpp +++ b/include/engine/api/route_parameters.hpp @@ -60,10 +60,10 @@ struct RouteParameters : public BaseParameters const bool alternatives_, const GeometriesType geometries_, const OverviewType overview_, - std::vector> uturns_, + boost::optional uturns_, Args... args_) : BaseParameters{std::forward(args_)...}, steps{steps_}, alternatives{alternatives_}, - geometries{geometries_}, overview{overview_}, uturns{std::move(uturns_)} + geometries{geometries_}, overview{overview_}, uturns{uturns_} { } @@ -71,12 +71,11 @@ struct RouteParameters : public BaseParameters bool alternatives = true; GeometriesType geometries = GeometriesType::Polyline; OverviewType overview = OverviewType::Simplified; - std::vector> uturns; + boost::optional uturns; bool IsValid() const { - return coordinates.size() >= 2 && BaseParameters::IsValid() && - (uturns.empty() || uturns.size() == coordinates.size()); + return coordinates.size() >= 2 && BaseParameters::IsValid(); } }; } diff --git a/include/engine/routing_algorithms/shortest_path.hpp b/include/engine/routing_algorithms/shortest_path.hpp index 0e41f1284..2d6dfaeb6 100644 --- a/include/engine/routing_algorithms/shortest_path.hpp +++ b/include/engine/routing_algorithms/shortest_path.hpp @@ -240,11 +240,9 @@ class ShortestPathRouting final static const constexpr bool UTURN_DEFAULT = false; void operator()(const std::vector &phantom_nodes_vector, - const std::vector> &uturn_indicators, + const boost::optional uturns, InternalRouteResult &raw_route_data) const { - BOOST_ASSERT(uturn_indicators.empty() || - uturn_indicators.size() == phantom_nodes_vector.size() + 1); engine_working_data.InitializeOrClearFirstThreadLocalStorage( super::facade->GetNumberOfNodes()); engine_working_data.InitializeOrClearSecondThreadLocalStorage( @@ -270,7 +268,7 @@ class ShortestPathRouting final std::vector total_packed_path_to_reverse; std::vector packed_leg_to_reverse_begin; - const bool use_uturn_indicators = !uturn_indicators.empty(); + const bool allow_u_turn_at_via = uturns ? *uturns : UTURN_DEFAULT; std::size_t current_leg = 0; // this implements a dynamic program that finds the shortest route through @@ -286,12 +284,6 @@ class ShortestPathRouting final const auto &source_phantom = phantom_node_pair.source_phantom; const auto &target_phantom = phantom_node_pair.target_phantom; - const bool use_uturn_default = - !use_uturn_indicators || !uturn_indicators[current_leg + 1]; - const bool allow_u_turn_at_via = - (use_uturn_default && UTURN_DEFAULT) || - (!use_uturn_default && *uturn_indicators[current_leg + 1]); - bool search_to_forward_node = target_phantom.forward_node_id != SPECIAL_NODEID; bool search_to_reverse_node = target_phantom.reverse_node_id != SPECIAL_NODEID; diff --git a/include/server/api/route_parameters_grammar.hpp b/include/server/api/route_parameters_grammar.hpp index 21fe915da..d85d43514 100644 --- a/include/server/api/route_parameters_grammar.hpp +++ b/include/server/api/route_parameters_grammar.hpp @@ -27,7 +27,7 @@ struct RouteParametersGrammar : public BaseParametersGrammar using AlternativeT = bool; using GeometriesT = engine::api::RouteParameters::GeometriesType; using OverviewT = engine::api::RouteParameters::OverviewType; - using UturnsT = std::vector>; + using UturnsT = bool; RouteParametersGrammar() : BaseParametersGrammar(root_rule, parameters) { @@ -72,9 +72,9 @@ struct RouteParametersGrammar : public BaseParametersGrammar overview_rule = qi::lit("overview=simplified")[set_simplified_type] | qi::lit("overview=full")[set_full_type] | qi::lit("overview=false")[set_false_type]; - uturns_rule = qi::lit("uturns=") >> -qi::bool_ % ";"; + uturns_rule = qi::lit("uturns=default") | (qi::lit("uturns=") >> qi::bool_)[set_uturns]; route_rule = steps_rule[set_steps] | alternatives_rule[set_alternatives] | geometries_rule | - overview_rule | uturns_rule[set_uturns]; + overview_rule | uturns_rule; root_rule = query_rule >> -qi::lit(".json") >> -(qi::lit("?") >> (route_rule | base_rule) % '&'); diff --git a/src/engine/plugins/trip.cpp b/src/engine/plugins/trip.cpp index 965435555..c834f4618 100644 --- a/src/engine/plugins/trip.cpp +++ b/src/engine/plugins/trip.cpp @@ -135,19 +135,7 @@ InternalRouteResult TripPlugin::ComputeRoute(const std::vector &sna } BOOST_ASSERT(min_route.segment_end_coordinates.size() == trip.size()); - std::vector> uturns; - if (parameters.uturns.size() > 0) - { - uturns.resize(trip.size() + 1); - std::transform(trip.begin(), trip.end(), uturns.begin(), [¶meters](const NodeID idx) - { - return parameters.uturns[idx]; - }); - BOOST_ASSERT(uturns.size() > 0); - uturns.back() = parameters.uturns[trip.front()]; - } - - shortest_path(min_route.segment_end_coordinates, uturns, min_route); + shortest_path(min_route.segment_end_coordinates, parameters.uturns, min_route); BOOST_ASSERT_MSG(min_route.shortest_path_length < INVALID_EDGE_WEIGHT, "unroutable route"); return min_route; diff --git a/src/server/service/route_service.cpp b/src/server/service/route_service.cpp index 9f59fc8a9..f06cbdbd3 100644 --- a/src/server/service/route_service.cpp +++ b/src/server/service/route_service.cpp @@ -25,9 +25,7 @@ std::string getWrongOptionHelp(const engine::api::RouteParameters ¶meters) constrainParamSize(PARAMETER_SIZE_MISMATCH_MSG, "bearings", parameters.bearings, coord_size, help) || constrainParamSize(PARAMETER_SIZE_MISMATCH_MSG, "radiuses", - parameters.radiuses, coord_size, help) || - constrainParamSize(PARAMETER_SIZE_MISMATCH_MSG, "uturns", - parameters.uturns, coord_size, help); + parameters.radiuses, coord_size, help); if (!param_size_mismatch && parameters.coordinates.size() < 2) { diff --git a/unit_tests/server/parameters_parser.cpp b/unit_tests/server/parameters_parser.cpp index 81b7c419b..efbf5e151 100644 --- a/unit_tests/server/parameters_parser.cpp +++ b/unit_tests/server/parameters_parser.cpp @@ -132,7 +132,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls) BOOST_CHECK_EQUAL(reference_1.alternatives, result_1->alternatives); BOOST_CHECK_EQUAL(reference_1.geometries, result_1->geometries); BOOST_CHECK_EQUAL(reference_1.overview, result_1->overview); - CHECK_EQUAL_RANGE(reference_1.uturns, result_1->uturns); + BOOST_CHECK_EQUAL(reference_1.uturns, result_1->uturns); CHECK_EQUAL_RANGE(reference_1.bearings, result_1->bearings); CHECK_EQUAL_RANGE(reference_1.radiuses, result_1->radiuses); CHECK_EQUAL_RANGE(reference_1.coordinates, result_1->coordinates); @@ -146,25 +146,24 @@ BOOST_AUTO_TEST_CASE(valid_route_urls) BOOST_CHECK_EQUAL(reference_2.alternatives, result_2->alternatives); BOOST_CHECK_EQUAL(reference_2.geometries, result_2->geometries); BOOST_CHECK_EQUAL(reference_2.overview, result_2->overview); - CHECK_EQUAL_RANGE(reference_2.uturns, result_2->uturns); + BOOST_CHECK_EQUAL(reference_2.uturns, result_2->uturns); CHECK_EQUAL_RANGE(reference_2.bearings, result_2->bearings); CHECK_EQUAL_RANGE(reference_2.radiuses, result_2->radiuses); CHECK_EQUAL_RANGE(reference_2.coordinates, result_2->coordinates); - std::vector> uturns_3 = {true, false, boost::none}; engine::api::RouteParameters reference_3{ false, false, engine::api::RouteParameters::GeometriesType::GeoJSON, - engine::api::RouteParameters::OverviewType::False, uturns_3}; + engine::api::RouteParameters::OverviewType::False, true}; reference_3.coordinates = coords_1; auto result_3 = api::parseParameters( - "1,2;3,4?steps=false&alternatives=false&geometries=geojson&overview=false&uturns=true;" + "1,2;3,4?steps=false&alternatives=false&geometries=geojson&overview=false&uturns=true" "false;"); BOOST_CHECK(result_3); BOOST_CHECK_EQUAL(reference_3.steps, result_3->steps); BOOST_CHECK_EQUAL(reference_3.alternatives, result_3->alternatives); BOOST_CHECK_EQUAL(reference_3.geometries, result_3->geometries); BOOST_CHECK_EQUAL(reference_3.overview, result_3->overview); - CHECK_EQUAL_RANGE(reference_3.uturns, result_3->uturns); + BOOST_CHECK_EQUAL(reference_3.uturns, result_3->uturns); CHECK_EQUAL_RANGE(reference_3.bearings, result_3->bearings); CHECK_EQUAL_RANGE(reference_3.radiuses, result_3->radiuses); CHECK_EQUAL_RANGE(reference_3.coordinates, result_3->coordinates); @@ -180,7 +179,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls) true, engine::api::RouteParameters::GeometriesType::Polyline, engine::api::RouteParameters::OverviewType::Simplified, - std::vector>{}, + boost::optional{}, coords_1, hints_4, std::vector>{}, @@ -196,7 +195,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls) BOOST_CHECK_EQUAL(reference_4.alternatives, result_4->alternatives); BOOST_CHECK_EQUAL(reference_4.geometries, result_4->geometries); BOOST_CHECK_EQUAL(reference_4.overview, result_4->overview); - CHECK_EQUAL_RANGE(reference_4.uturns, result_4->uturns); + BOOST_CHECK_EQUAL(reference_4.uturns, result_4->uturns); CHECK_EQUAL_RANGE(reference_4.bearings, result_4->bearings); CHECK_EQUAL_RANGE(reference_4.radiuses, result_4->radiuses); CHECK_EQUAL_RANGE(reference_4.coordinates, result_4->coordinates); @@ -208,7 +207,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls) true, engine::api::RouteParameters::GeometriesType::Polyline, engine::api::RouteParameters::OverviewType::Simplified, - std::vector>{}, + boost::optional{}, coords_1, std::vector>{}, std::vector>{}, @@ -220,7 +219,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls) BOOST_CHECK_EQUAL(reference_5.alternatives, result_5->alternatives); BOOST_CHECK_EQUAL(reference_5.geometries, result_5->geometries); BOOST_CHECK_EQUAL(reference_5.overview, result_5->overview); - CHECK_EQUAL_RANGE(reference_5.uturns, result_5->uturns); + BOOST_CHECK_EQUAL(reference_5.uturns, result_5->uturns); CHECK_EQUAL_RANGE(reference_5.bearings, result_5->bearings); CHECK_EQUAL_RANGE(reference_5.radiuses, result_5->radiuses); CHECK_EQUAL_RANGE(reference_5.coordinates, result_5->coordinates); @@ -238,7 +237,7 @@ BOOST_AUTO_TEST_CASE(valid_route_urls) BOOST_CHECK_EQUAL(reference_6.alternatives, result_6->alternatives); BOOST_CHECK_EQUAL(reference_6.geometries, result_6->geometries); BOOST_CHECK_EQUAL(reference_6.overview, result_6->overview); - CHECK_EQUAL_RANGE(reference_6.uturns, result_6->uturns); + BOOST_CHECK_EQUAL(reference_6.uturns, result_6->uturns); CHECK_EQUAL_RANGE(reference_6.bearings, result_6->bearings); CHECK_EQUAL_RANGE(reference_6.radiuses, result_6->radiuses); CHECK_EQUAL_RANGE(reference_6.coordinates, result_6->coordinates);