diff --git a/CHANGELOG.md b/CHANGELOG.md index 75d46ebc2..098a230fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ - Guidance - Handle Access tags for lanes, only considering valid lanes in lane-guidance (think car | car | bike | car) - Improved the detection of non-noticeable name-changes + - Summaries have been improved to consider references as well - API: - `annotations=true` now returns the data source id for each segment as `datasources` - Reduced semantic of merge to refer only to merges from a lane onto a motorway-like road diff --git a/features/car/summaries.feature b/features/car/summaries.feature new file mode 100644 index 000000000..1cfd461b8 --- /dev/null +++ b/features/car/summaries.feature @@ -0,0 +1,94 @@ +@routing @basic @car +Feature: Basic Routing + + Background: + Given the profile "car" + Given a grid size of 500 meters + + @smallest + Scenario: Summaries when routing on a simple network + Given the node map + | b | | | f | + | | | | | + | c | d | | g | + | | | | | + | a | | e | | + + And the ways + | nodes | name | + | acb | road | + | de | 1 st | + | cd | | + | dg | blvd | + | df | street | + + When I route I should get + | waypoints | route | summary | + | a,e | road,,1 st,1 st | road,1 st | + | a,d,f | road,,,street,street | road;street | + | a,e,f | road,,1 st,1 st,1 st,street,street | road,1 st;1 st,street | + + Scenario: Name Empty + Given the node map + | a | | b | | | c | + + And the ways + | nodes | name | + | ab | road | + | bc | | + + When I route I should get + | waypoints | route | summary | + | a,c | road, | road | + + Scenario: Name Empty But Ref + Given the node map + | a | | b | | | c | + + And the ways + | nodes | name | ref | + | ab | road | | + | bc | | 101 | + + When I route I should get + | waypoints | route | summary | + | a,c | road, | road,101 | + + Scenario: Only Refs + Given the node map + | a | | b | | | c | + + And the ways + | nodes | name | ref | + | ab | | 100 | + | bc | | 101 | + + When I route I should get + | waypoints | route | summary | + | a,c | , | 100,101 | + + Scenario: Single Ref + Given the node map + | a | | b | | | c | + + And the ways + | nodes | name | ref | + | ab | | | + | bc | | 101 | + + When I route I should get + | waypoints | route | summary | + | a,c | ,, | 101 | + + Scenario: Nothing + Given the node map + | a | | b | | | c | + + And the ways + | nodes | name | + | ab | | + | bc | | + + When I route I should get + | waypoints | route | summary | + | a,c | , | | diff --git a/features/testbot/summaries.feature b/features/testbot/summaries.feature deleted file mode 100644 index cbadc7e12..000000000 --- a/features/testbot/summaries.feature +++ /dev/null @@ -1,29 +0,0 @@ -@routing @basic @testbot -Feature: Basic Routing - - Background: - Given the profile "testbot" - Given a grid size of 500 meters - - @smallest - Scenario: Summaries when routing on a simple network - Given the node map - | b | | | f | - | | | | | - | c | d | | g | - | | | | | - | a | | e | | - - And the ways - | nodes | name | - | acb | road | - | de | 1 st | - | cd | | - | dg | blvd | - | df | street | - - When I route I should get - | waypoints | route | summary | - | a,e | road,,1 st,1 st | road, 1 st | - | a,d,f | road,,,street,street | road;street | - | a,e,f | road,,1 st,1 st,1 st,street,street | road, 1 st;1 st, street | diff --git a/features/testbot/summary.feature b/features/testbot/summary.feature index 563230a03..d2a646d8c 100644 --- a/features/testbot/summary.feature +++ b/features/testbot/summary.feature @@ -18,12 +18,12 @@ Feature: Basic Routing | de | When I route I should get - | from | to | route | summary | - | a | e | ab,bc,cd,de,de | ab, bc | - | e | a | de,cd,bc,ab,ab | de, bc | - | a | b | ab,ab | ab | - | b | d | bc,cd,cd | bc, cd | - | 1 | c | bc,bc | bc | + | from | to | route | summary | + | a | e | ab,bc,cd,de,de | ab,bc | + | e | a | de,cd,bc,ab,ab | de,bc | + | a | b | ab,ab | ab | + | b | d | bc,cd,cd | bc,cd | + | 1 | c | bc,bc | bc | @smallest Scenario: Check handling empty values @@ -40,8 +40,8 @@ Feature: Basic Routing | df | df | When I route I should get - | from | to | route | summary | - | e | a | de,,bc,ab,ab | de, bc | + | from | to | route | summary | + | e | a | de,,bc,ab,ab | de,bc | @smallest @todo Scenario: Summaries when routing on a simple network @@ -53,9 +53,9 @@ Feature: Basic Routing | ab | When I route I should get - | from | to | route | summary | - | a | b | ab,ab | ab | - | b | a | ab,ab | ab | + | from | to | route | summary | + | a | b | ab,ab | ab | + | b | a | ab,ab | ab | @repeated Scenario: Check handling empty values @@ -74,6 +74,6 @@ Feature: Basic Routing | xey | cross |we need this because phantom node segments are not considered for the summary | When I route I should get - | from | to | route | summary | - | a | 1 | first,first,second,second | first, second | + | from | to | route | summary | + | a | 1 | first,first,second,second | first,second | diff --git a/include/engine/guidance/assemble_leg.hpp b/include/engine/guidance/assemble_leg.hpp index fcfa51138..3613b42c4 100644 --- a/include/engine/guidance/assemble_leg.hpp +++ b/include/engine/guidance/assemble_leg.hpp @@ -6,7 +6,11 @@ #include "engine/guidance/route_leg.hpp" #include "engine/guidance/route_step.hpp" #include "engine/internal_route_result.hpp" +#include "util/typedefs.hpp" + #include +#include +#include #include #include @@ -108,7 +112,7 @@ std::array summarizeRoute(const std::vector summary; - std::fill(summary.begin(), summary.end(), 0); + std::fill(summary.begin(), summary.end(), EMPTY_NAMEID); std::transform(segments.begin(), segments.end(), summary.begin(), @@ -173,21 +177,28 @@ inline RouteLeg assembleLeg(const datafacade::BaseDataFacade &facade, { auto summary_array = detail::summarizeRoute( route_data, target_node, target_traversed_in_reverse); - if (route_data.empty()) - summary_array[0] = source_node.name_id; BOOST_ASSERT(detail::MAX_USED_SEGMENTS > 0); BOOST_ASSERT(summary_array.begin() != summary_array.end()); - std::vector summary_names; - for (auto nameIt = summary_array.begin(), end = summary_array.end(); nameIt != end; ++nameIt) - { - auto name = facade.GetNameForID(* nameIt); - name = name.empty() ? facade.GetRefForID(* nameIt) : name; + + // transform a name_id into a string containing either the name, or -if the name is empty- + // the reference. + const auto name_id_to_string = [&](const NameID name_id) { + const auto name = facade.GetNameForID(name_id); if (!name.empty()) - summary_names.push_back(name); - } - BOOST_ASSERT(summary_names.size() =< MAX_USED_SEGMENTS); - summary = boost::algorithm::join(summary_names, ", "); + return name; + else + { + const auto ref = facade.GetRefForID(name_id); + return ref; + } + }; + + const auto not_empty = [&](const std::string &name) { return !name.empty(); }; + + const auto summary_names = summary_array | boost::adaptors::transformed(name_id_to_string) | + boost::adaptors::filtered(not_empty); + summary = boost::algorithm::join(summary_names, ","); } return RouteLeg{duration, distance, summary, {}};