Skip to content

Commit

Permalink
Adds generate_hints=true for dropping hints in response, resolves #…
Browse files Browse the repository at this point in the history
…1789.

Adds an `generate_hints=false` option which lets us skip generating and
emitting hints for Waypoints. This can be used to decrease the response
size when the user does not need hints anyway.

We should think about making `false` the default here in v6.
  • Loading branch information
daniel-j-h committed Dec 19, 2016
1 parent f04d146 commit b1f6797
Show file tree
Hide file tree
Showing 13 changed files with 83 additions and 22 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# 5.5.1
- Changes from 5.5.0
- API:
- Adds `generate_hints=true` (`true` by default) which lets user disable `Hint` generating in the response. Use if you don't need `Hint`s!
- Bugfixes
- Fix #3418 and ensure we only return bearings in the range 0-359 in API responses
- Fixed a bug that could lead to emitting false instructions for staying on a roundabout
Expand Down
11 changes: 6 additions & 5 deletions docs/http.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,12 @@ To pass parameters to each location some options support an array like encoding:

**Request options**

| Option | Values | Description |
|------------|--------------------------------------------------------|-------------------------------------------------------------------------------------------------------|
|bearings |`{bearing};{bearing}[;{bearing} ...]` |Limits the search to segments with given bearing in degrees towards true north in clockwise direction. |
|radiuses |`{radius};{radius}[;{radius} ...]` |Limits the search to given radius in meters. |
|hints |`{hint};{hint}[;{hint} ...]` |Hint from previous request to derive position in street network. |
| Option | Values | Description |
|----------------|--------------------------------------------------------|-------------------------------------------------------------------------------------------------------|
|bearings |`{bearing};{bearing}[;{bearing} ...]` |Limits the search to segments with given bearing in degrees towards true north in clockwise direction. |
|radiuses |`{radius};{radius}[;{radius} ...]` |Limits the search to given radius in meters. |
|generate\_hints |`true` (default), `false` |Adds a Hint to the response which can be used in subsequent requests, see `hints` parameter. |
|hints |`{hint};{hint}[;{hint} ...]` |Hint from previous request to derive position in street network. |

Where the elements follow the following format:

Expand Down
16 changes: 11 additions & 5 deletions include/engine/api/base_api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,19 @@ class BaseAPI
return waypoints;
}

// FIXME gcc 4.8 doesn't support for lambdas to call protected member functions
// protected:
protected:
util::json::Object MakeWaypoint(const PhantomNode &phantom) const
{
return json::makeWaypoint(phantom.location,
facade.GetNameForID(phantom.name_id),
Hint{phantom, facade.GetCheckSum()});
if (parameters.generate_hints)
{
return json::makeWaypoint(phantom.location,
facade.GetNameForID(phantom.name_id),
Hint{phantom, facade.GetCheckSum()});
}
else
{
return json::makeWaypoint(phantom.location, facade.GetNameForID(phantom.name_id));
}
}

const datafacade::BaseDataFacade &facade;
Expand Down
3 changes: 3 additions & 0 deletions include/engine/api/base_parameters.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ struct BaseParameters
std::vector<boost::optional<double>> radiuses;
std::vector<boost::optional<Bearing>> bearings;

// Adds hints to response which can be included in subsequent requests, see `hints` above.
bool generate_hints = true;

// FIXME add validation for invalid bearing values
bool IsValid() const
{
Expand Down
4 changes: 4 additions & 0 deletions include/engine/api/json_factory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ util::json::Object makeRoute(const guidance::Route &route,
util::json::Array legs,
boost::optional<util::json::Value> geometry);

// Creates a Waypoint without Hint, see the Hint overload below
util::json::Object makeWaypoint(const util::Coordinate location, std::string name);

// Creates a Waypoint with Hint, see the overload above when Hint is not needed
util::json::Object
makeWaypoint(const util::Coordinate location, std::string name, const Hint &hint);

Expand Down
4 changes: 1 addition & 3 deletions include/engine/api/match_api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,7 @@ class MatchAPI final : public RouteAPI
response.values["code"] = "Ok";
}

// FIXME gcc 4.8 doesn't support for lambdas to call protected member functions
// protected:

protected:
// FIXME this logic is a little backwards. We should change the output format of the
// map_matching
// routing algorithm to be easier to consume here.
Expand Down
3 changes: 1 addition & 2 deletions include/engine/api/route_api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,7 @@ class RouteAPI : public BaseAPI
response.values["code"] = "Ok";
}

// FIXME gcc 4.8 doesn't support for lambdas to call protected member functions
// protected:
protected:
template <typename ForwardIter>
util::json::Value MakeGeometry(ForwardIter begin, ForwardIter end) const
{
Expand Down
3 changes: 1 addition & 2 deletions include/engine/api/table_api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,7 @@ class TableAPI final : public BaseAPI
response.values["code"] = "Ok";
}

// FIXME gcc 4.8 doesn't support for lambdas to call protected member functions
// protected:
protected:
virtual util::json::Array MakeWaypoints(const std::vector<PhantomNode> &phantoms) const
{
util::json::Array json_waypoints;
Expand Down
4 changes: 1 addition & 3 deletions include/engine/api/trip_api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,7 @@ class TripAPI final : public RouteAPI
response.values["code"] = "Ok";
}

// FIXME gcc 4.8 doesn't support for lambdas to call protected member functions
// protected:

protected:
// FIXME this logic is a little backwards. We should change the output format of the
// trip plugin routing algorithm to be easier to consume here.
util::json::Array MakeWaypoints(const std::vector<std::vector<NodeID>> &sub_trips,
Expand Down
11 changes: 10 additions & 1 deletion include/server/api/base_parameters_grammar.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,11 +141,18 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
add_hint, qi::_r1, qi::_1)] %
';';

generate_hints_rule =
qi::lit("generate_hints=") >
qi::bool_[ph::bind(&engine::api::BaseParameters::generate_hints, qi::_r1) = qi::_1];

bearings_rule =
qi::lit("bearings=") >
(-(qi::short_ > ',' > qi::short_))[ph::bind(add_bearing, qi::_r1, qi::_1)] % ';';

base_rule = radiuses_rule(qi::_r1) | hints_rule(qi::_r1) | bearings_rule(qi::_r1);
base_rule = radiuses_rule(qi::_r1) //
| hints_rule(qi::_r1) //
| bearings_rule(qi::_r1) //
| generate_hints_rule(qi::_r1);
}

protected:
Expand All @@ -157,6 +164,8 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
qi::rule<Iterator, Signature> radiuses_rule;
qi::rule<Iterator, Signature> hints_rule;

qi::rule<Iterator, Signature> generate_hints_rule;

qi::rule<Iterator, osrm::engine::Bearing()> bearing_rule;
qi::rule<Iterator, osrm::util::Coordinate()> location_rule;
qi::rule<Iterator, std::vector<osrm::util::Coordinate>()> polyline_rule;
Expand Down
8 changes: 7 additions & 1 deletion src/engine/api/json_factory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,11 +288,17 @@ util::json::Object makeRoute(const guidance::Route &route,
return json_route;
}

util::json::Object makeWaypoint(const util::Coordinate location, std::string name, const Hint &hint)
util::json::Object makeWaypoint(const util::Coordinate location, std::string name)
{
util::json::Object waypoint;
waypoint.values["location"] = detail::coordinateToLonLat(location);
waypoint.values["name"] = std::move(name);
return waypoint;
}

util::json::Object makeWaypoint(const util::Coordinate location, std::string name, const Hint &hint)
{
auto waypoint = makeWaypoint(location, name);
waypoint.values["hint"] = hint.ToBase64();
return waypoint;
}
Expand Down
21 changes: 21 additions & 0 deletions unit_tests/library/route.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -361,4 +361,25 @@ BOOST_AUTO_TEST_CASE(test_route_response_for_locations_across_components)
}
}

BOOST_AUTO_TEST_CASE(test_route_user_disables_generating_hints)
{
const auto args = get_args();
auto osrm = getOSRM(args.at(0));

using namespace osrm;

RouteParameters params;
params.steps = true;
params.coordinates.push_back(get_dummy_location());
params.coordinates.push_back(get_dummy_location());
params.generate_hints = false;

json::Object result;
const auto rc = osrm.Route(params, result);
BOOST_CHECK(rc == Status::Ok);

for (auto waypoint : result.values["waypoints"].get<json::Array>().values)
BOOST_CHECK_EQUAL(waypoint.get<json::Object>().values.count("hint"), 0);
}

BOOST_AUTO_TEST_SUITE_END()
15 changes: 15 additions & 0 deletions unit_tests/server/parameters_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ BOOST_AUTO_TEST_CASE(invalid_route_urls)
29UL);
BOOST_CHECK_EQUAL(testInvalidOptions<RouteParameters>("1,2;3,4?overview=false&hints=;;; ;"),
32UL);
BOOST_CHECK_EQUAL(testInvalidOptions<RouteParameters>("1,2;3,4?generate_hints=notboolean"),
23UL);
BOOST_CHECK_EQUAL(testInvalidOptions<RouteParameters>("1,2;3,4?overview=false&geometries=foo"),
34UL);
BOOST_CHECK_EQUAL(testInvalidOptions<RouteParameters>("1,2;3,4?overview=false&overview=foo"),
Expand Down Expand Up @@ -296,6 +298,19 @@ BOOST_AUTO_TEST_CASE(valid_route_urls)
CHECK_EQUAL_RANGE(reference_10.radiuses, result_10->radiuses);
CHECK_EQUAL_RANGE(reference_10.coordinates, result_10->coordinates);
CHECK_EQUAL_RANGE(reference_10.hints, result_10->hints);

// Do not generate Hints when they are explicitely disabled
auto result_11 = parseParameters<RouteParameters>("1,2;3,4?generate_hints=false");
BOOST_CHECK(result_11);
BOOST_CHECK_EQUAL(result_11->generate_hints, false);

auto result_12 = parseParameters<RouteParameters>("1,2;3,4?generate_hints=true");
BOOST_CHECK(result_12);
BOOST_CHECK_EQUAL(result_12->generate_hints, true);

auto result_13 = parseParameters<RouteParameters>("1,2;3,4");
BOOST_CHECK(result_13);
BOOST_CHECK_EQUAL(result_13->generate_hints, true);
}

BOOST_AUTO_TEST_CASE(valid_table_urls)
Expand Down

0 comments on commit b1f6797

Please sign in to comment.