Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Squashed commit of the following: #1

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Descriptors/GPXDescriptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,9 @@ class GPXDescriptor : public BaseDescriptor<DataFacadeT> {
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
"xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 gpx.xsd"
"\">");
reply.content.push_back("<metadata>");
reply.content.push_back(
"<metadata><copyright author=\"Project OSRM\"><license>Data (c)"
"<copyright author=\"Project OSRM\"><license>Data (c)"
" OpenStreetMap contributors (ODbL)</license></copyright>"
"</metadata>");
reply.content.push_back("<rte>");
Expand Down
5 changes: 2 additions & 3 deletions Descriptors/JSONDescriptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,8 @@ class JSONDescriptor : public BaseDescriptor<DataFacadeT> {
http::Reply & reply
) {
facade = f;
reply.content.push_back(
"{\"status\":"
);
reply.content.push_back("{");
reply.content.push_back("\"status\":");

if(INT_MAX == raw_route.lengthOfShortestPath) {
//We do not need to do much, if there is no route ;-)
Expand Down
6 changes: 6 additions & 0 deletions Include/osrm/RouteParameters.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ struct RouteParameters {
geometry(true),
compression(true),
deprecatedAPI(false),
exec_time(false),
checkSum(-1)
{ }

Expand All @@ -54,6 +55,7 @@ struct RouteParameters {
bool geometry;
bool compression;
bool deprecatedAPI;
bool exec_time;
unsigned checkSum;
std::string service;
std::string outputFormat;
Expand All @@ -76,6 +78,10 @@ struct RouteParameters {
deprecatedAPI = true;
}

void setExecTimeFlag(const bool b) {
exec_time = b;
}

void setChecksum(const unsigned c) {
checkSum = c;
}
Expand Down
11 changes: 10 additions & 1 deletion Plugins/NearestPlugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "BasePlugin.h"
#include "../DataStructures/PhantomNodes.h"
#include "../Util/StringUtil.h"
#include "../Util/TimingUtil.h"

#include <boost/unordered_map.hpp>

Expand Down Expand Up @@ -65,13 +66,16 @@ class NearestPlugin : public BasePlugin {
return;
}

TimeMeasurement exec_time;
PhantomNode result;
facade->FindPhantomNodeForCoordinate(
routeParameters.coordinates[0],
result,
routeParameters.zoomLevel
);

int64_t time_ms = exec_time.toNowInMs();

std::string temp_string;
//json

Expand All @@ -81,7 +85,12 @@ class NearestPlugin : public BasePlugin {
}

reply.status = http::Reply::ok;
reply.content.push_back("{\"status\":");
reply.content.push_back("{");
if (routeParameters.exec_time) {
int64ToString(time_ms, temp_string);
reply.content.push_back("\"exec_time_ms\":" + temp_string + ",");
}
reply.content.push_back("\"status\":");
if(UINT_MAX != result.edgeBasedNode) {
reply.content.push_back("0,");
} else {
Expand Down
30 changes: 25 additions & 5 deletions Plugins/ViaRoutePlugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../Descriptors/JSONDescriptor.h"
#include "../Util/SimpleLogger.h"
#include "../Util/StringUtil.h"
#include "../Util/TimingUtil.h"

#include <boost/unordered_map.hpp>

Expand Down Expand Up @@ -81,6 +82,7 @@ class ViaRoutePlugin : public BasePlugin {
return;
}

TimeMeasurement exec_time;
RawRouteData rawRoute;
rawRoute.checkSum = facade->GetCheckSum();
const bool checksumOK = (routeParameters.checkSum == rawRoute.checkSum);
Expand Down Expand Up @@ -156,17 +158,16 @@ class ViaRoutePlugin : public BasePlugin {
descriptorConfig.geometry = routeParameters.geometry;
descriptorConfig.encode_geometry = routeParameters.compression;

std::string exec_time_token;
switch(descriptorType){
case 0:
desc = new JSONDescriptor<DataFacadeT>();

break;
case 1:
desc = new GPXDescriptor<DataFacadeT>();

exec_time_token = "<metadata>";
break;
case 0:
default:
desc = new JSONDescriptor<DataFacadeT>();
exec_time_token = "{";

break;
}
Expand All @@ -177,6 +178,25 @@ class ViaRoutePlugin : public BasePlugin {
desc->SetConfig(descriptorConfig);

desc->Run(rawRoute, phantomNodes, facade, reply);

if (routeParameters.exec_time) {
int64_t time_ms = exec_time.toNowInMs();
std::vector<std::string>::iterator it = reply.content.begin();
for (; it != reply.content.end(); ++it) {
if (0 == (*it).compare(0, exec_time_token.size(), exec_time_token)) {
break; // we have found place to insert exec time metric
}
}
if (it != reply.content.end()) {
std::string temp_string;
int64ToString(time_ms, temp_string);
reply.content.insert(++it, (1 == descriptorType)?
"<exec_time_ms>" + temp_string + "</exec_time_ms>" : "\"exec_time_ms\":" + temp_string + ","
);
} else {
SimpleLogger().Write(logDEBUG) << "Can't find place to insert exec time metric";
}
}
if("" != routeParameters.jsonpParameter) {
reply.content.push_back(")\n");
}
Expand Down
5 changes: 3 additions & 2 deletions Server/APIGrammar.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ template <typename Iterator, class HandlerT>
struct APIGrammar : qi::grammar<Iterator> {
APIGrammar(HandlerT * h) : APIGrammar::base_type(api_call), handler(h) {
api_call = qi::lit('/') >> string[boost::bind(&HandlerT::setService, handler, ::_1)] >> *(query);
query = ('?') >> (+(zoom | output | jsonp | checksum | location | hint | cmp | language | instruction | geometry | alt_route | old_API) ) ;
query = ('?') >> (+(zoom | output | jsonp | checksum | location | hint | cmp | language | instruction | geometry | alt_route | old_API | exec_time) ) ;

zoom = (-qi::lit('&')) >> qi::lit('z') >> '=' >> qi::short_[boost::bind(&HandlerT::setZoomLevel, handler, ::_1)];
output = (-qi::lit('&')) >> qi::lit("output") >> '=' >> string[boost::bind(&HandlerT::setOutputFormat, handler, ::_1)];
Expand All @@ -52,6 +52,7 @@ struct APIGrammar : qi::grammar<Iterator> {
language = (-qi::lit('&')) >> qi::lit("hl") >> '=' >> string[boost::bind(&HandlerT::setLanguage, handler, ::_1)];
alt_route = (-qi::lit('&')) >> qi::lit("alt") >> '=' >> qi::bool_[boost::bind(&HandlerT::setAlternateRouteFlag, handler, ::_1)];
old_API = (-qi::lit('&')) >> qi::lit("geomformat") >> '=' >> string[boost::bind(&HandlerT::setDeprecatedAPIFlag, handler, ::_1)];
exec_time = (-qi::lit('&')) >> qi::lit("exec_time") >> '=' >> qi::bool_[boost::bind(&HandlerT::setExecTimeFlag, handler, ::_1)];

string = +(qi::char_("a-zA-Z"));
stringwithDot = +(qi::char_("a-zA-Z0-9_.-"));
Expand All @@ -61,7 +62,7 @@ struct APIGrammar : qi::grammar<Iterator> {
qi::rule<Iterator> api_call, query;
qi::rule<Iterator, std::string()> service, zoom, output, string, jsonp, checksum, location, hint,
stringwithDot, stringwithPercent, language, instruction, geometry,
cmp, alt_route, old_API;
cmp, alt_route, old_API, exec_time;

HandlerT * handler;
};
Expand Down
25 changes: 25 additions & 0 deletions Util/TimingUtil.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef TIMINGUTIL_H_
#define TIMINGUTIL_H_

#include "../typedefs.h"

#include <boost/date_time/posix_time/posix_time.hpp>

// excluded as this requires boost 1.47 (for now)
// #include <boost/chrono.hpp>
// #include <boost/timer/timer.hpp>
Expand Down Expand Up @@ -68,4 +72,25 @@ static inline double get_timestamp() {
return double(tp.tv_sec) + tp.tv_usec / 1000000.;
}

class TimeMeasurement {
public:
TimeMeasurement() throw() { fromNow(); }
inline void fromNow() throw() {
m_from = boost::posix_time::microsec_clock::local_time();
}
// get time period from the fromNow() func. calling to now in milliseconds
inline int64_t toNowInMs() const throw() {
boost::posix_time::time_duration diff = boost::posix_time::microsec_clock::local_time() - m_from;
return diff.total_milliseconds();
}
// get time period from the fromNow() func. calling to now in seconds
inline int64_t toNowInSec() const throw() {
boost::posix_time::time_duration diff = boost::posix_time::microsec_clock::local_time() - m_from;
return diff.total_seconds();
}

private:
boost::posix_time::ptime m_from;
};

#endif /* TIMINGUTIL_H_ */