From eb058b64da8f8703acffde62a2b9480a8a2f7be0 Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Thu, 2 Mar 2017 19:11:41 +0300 Subject: [PATCH 1/2] [search] Added simple search http server. --- search/pysearch/bindings.cpp | 32 +++-------- search/pysearch/run_search_engine.py | 2 +- search/pysearch/run_search_server.py | 80 ++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 27 deletions(-) create mode 100755 search/pysearch/run_search_server.py diff --git a/search/pysearch/bindings.cpp b/search/pysearch/bindings.cpp index 119f019382..bf596a044c 100644 --- a/search/pysearch/bindings.cpp +++ b/search/pysearch/bindings.cpp @@ -15,6 +15,7 @@ #include "coding/file_name_utils.hpp" +#include "geometry/mercator.hpp" #include "geometry/rect2d.hpp" #include "base/logging.hpp" @@ -69,22 +70,6 @@ void Init(string const & resource_path, string const & mwm_path) g_storage->Init(&DidDownload, &WillDelete); } -struct LatLon -{ - LatLon() = default; - LatLon(double lat, double lon) : m_lat(lat), m_lon(lon) {} - - string ToString() const - { - ostringstream os; - os << "lat: " << m_lat << ", lon: " << m_lon; - return os.str(); - } - - double m_lat = 0.0; - double m_lon = 0.0; -}; - struct Mercator { Mercator() = default; @@ -123,14 +108,14 @@ struct Params string ToString() const { ostringstream os; - os << m_query << ", " << m_locale << ", " << m_latLon.ToString() << ", " + os << m_query << ", " << m_locale << ", " << m_position.ToString() << ", " << m_viewport.ToString(); return os.str(); } string m_query; string m_locale; - LatLon m_latLon; + Mercator m_position; Viewport m_viewport; }; @@ -193,7 +178,8 @@ struct SearchEngineProxy sp.m_query = params.m_query; sp.m_inputLocale = params.m_locale; sp.m_mode = search::Mode::Everywhere; - sp.SetPosition(params.m_latLon.m_lat, params.m_latLon.m_lon); + sp.SetPosition(MercatorBounds::YToLat(params.m_position.m_y), + MercatorBounds::XToLon(params.m_position.m_x)); sp.m_suggestsEnabled = false; auto const & bottomLeft = params.m_viewport.m_min; @@ -218,12 +204,6 @@ BOOST_PYTHON_MODULE(pysearch) def("init", &Init); - class_("LatLon") - .def(init()) - .def_readwrite("lat", &LatLon::m_lat) - .def_readwrite("lon", &LatLon::m_lon) - .def("to_string", &LatLon::ToString); - class_("Mercator") .def(init()) .def_readwrite("x", &Mercator::m_x) @@ -239,7 +219,7 @@ BOOST_PYTHON_MODULE(pysearch) class_("Params") .def_readwrite("query", &Params::m_query) .def_readwrite("locale", &Params::m_locale) - .def_readwrite("lat_lon", &Params::m_latLon) + .def_readwrite("position", &Params::m_position) .def_readwrite("viewport", &Params::m_viewport) .def("to_string", &Params::ToString); diff --git a/search/pysearch/run_search_engine.py b/search/pysearch/run_search_engine.py index 145e12f41e..a0c4ec31f4 100755 --- a/search/pysearch/run_search_engine.py +++ b/search/pysearch/run_search_engine.py @@ -22,7 +22,7 @@ engine = search.SearchEngine() params = search.Params() params.query = 'кафе юность' params.locale = 'ru' -params.lat_lon = search.LatLon(55.751633, 37.618705) +params.position = search.Mercator(37.618705, 67.455669) params.viewport = search.Viewport(search.Mercator(37.1336, 67.1349), search.Mercator(38.0314, 67.7348)) for result in engine.query(params): diff --git a/search/pysearch/run_search_server.py b/search/pysearch/run_search_server.py new file mode 100755 index 0000000000..bb3b809d0d --- /dev/null +++ b/search/pysearch/run_search_server.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python2.7 +# -*- coding: utf-8 -*- + +from __future__ import print_function +from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer +import argparse +import json +import os +import pysearch +import urlparse + +DIR = os.path.dirname(__file__) +RESOURCE_PATH = os.path.realpath(os.path.join(DIR, '..', '..', 'data')) +MWM_PATH = os.path.realpath(os.path.join(DIR, '..', '..', 'data')) +PORT=8080 + + +class HTTPHandler(BaseHTTPRequestHandler): + def do_GET(self): + result = urlparse.urlparse(self.path) + query = urlparse.parse_qs(result.query) + + def sparam(name): + return query[name][-1] + + def fparam(name): + return float(sparam(name)) + + params = pysearch.Params() + try: + params.query = sparam('query') + params.locale = sparam('locale') + params.position = pysearch.Mercator(fparam('posx'), fparam('posy')) + params.viewport = pysearch.Viewport(pysearch.Mercator(fparam('minx'), fparam('miny')), + pysearch.Mercator(fparam('maxx'), fparam('maxy'))) + except KeyError: + self.send_response(400) + return + + results = HTTPHandler.engine.query(params) + + responses = [{'name': result.name, + 'address': result.address, + 'has_center': result.has_center, + 'center': {'x': result.center.x, + 'y': result.center.y + } + } + for result in results] + + self.send_response(200) + self.send_header("Content-Type", "application/json") + self.end_headers() + json.dump(responses, self.wfile) + + +def main(args): + pysearch.init(args.r, args.m) + engine = pysearch.SearchEngine() + HTTPHandler.engine = pysearch.SearchEngine() + + try: + print('Starting HTTP server on port', PORT) + server = HTTPServer(('', args.p), HTTPHandler) + server.serve_forever() + finally: + server.socket.close() + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser.add_argument('-r', metavar='RESOURCE_PATH', default=RESOURCE_PATH, + help='Path to resources directory.') + parser.add_argument('-m', metavar='MWM_PATH', default=MWM_PATH, + help='Path to mwm files.') + parser.add_argument('-p', metavar='PORT', default=PORT, + help='Port for the server to listen') + args = parser.parse_args() + + main(args) From 201c9cdf46bb75408405fb37bec3640ea6ab19e5 Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Fri, 3 Mar 2017 19:29:59 +0300 Subject: [PATCH 2/2] Review fixes. --- search/pysearch/run_search_server.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/search/pysearch/run_search_server.py b/search/pysearch/run_search_server.py index bb3b809d0d..f878322487 100755 --- a/search/pysearch/run_search_server.py +++ b/search/pysearch/run_search_server.py @@ -31,8 +31,9 @@ class HTTPHandler(BaseHTTPRequestHandler): params.query = sparam('query') params.locale = sparam('locale') params.position = pysearch.Mercator(fparam('posx'), fparam('posy')) - params.viewport = pysearch.Viewport(pysearch.Mercator(fparam('minx'), fparam('miny')), - pysearch.Mercator(fparam('maxx'), fparam('maxy'))) + params.viewport = pysearch.Viewport( + pysearch.Mercator(fparam('minx'), fparam('miny')), + pysearch.Mercator(fparam('maxx'), fparam('maxy'))) except KeyError: self.send_response(400) return @@ -59,16 +60,14 @@ def main(args): engine = pysearch.SearchEngine() HTTPHandler.engine = pysearch.SearchEngine() - try: - print('Starting HTTP server on port', PORT) - server = HTTPServer(('', args.p), HTTPHandler) - server.serve_forever() - finally: - server.socket.close() + print('Starting HTTP server on port', PORT) + server = HTTPServer(('', args.p), HTTPHandler) + server.serve_forever() if __name__ == '__main__': - parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('-r', metavar='RESOURCE_PATH', default=RESOURCE_PATH, help='Path to resources directory.') parser.add_argument('-m', metavar='MWM_PATH', default=MWM_PATH,