Compare commits
50 Commits
0.26.0-cli
...
python-0.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f996cb35db | ||
|
|
bbfa03749a | ||
|
|
84276b4cd3 | ||
|
|
b608830bce | ||
|
|
a8140e53c3 | ||
|
|
c28ca4861a | ||
|
|
b269c46724 | ||
|
|
6b6fbef586 | ||
|
|
eb4638a326 | ||
|
|
a919b87664 | ||
|
|
98a4ed81c5 | ||
|
|
0ec1e051be | ||
|
|
850497ef79 | ||
|
|
8d2d0ececd | ||
|
|
90fd8587e2 | ||
|
|
64a0616c97 | ||
|
|
b1bdf2460e | ||
|
|
04bbb32849 | ||
|
|
3e6c273b48 | ||
|
|
522591dd63 | ||
|
|
75d0959aff | ||
|
|
b2cdb378fb | ||
|
|
100319ed0e | ||
|
|
5e161b55d2 | ||
|
|
7f4b87f513 | ||
|
|
378458c0ae | ||
|
|
4ae4080bba | ||
|
|
2bb67ba17a | ||
|
|
1027d554a5 | ||
|
|
4e1f081952 | ||
|
|
87bb8bea68 | ||
|
|
dc47f6f71b | ||
|
|
2f6d067b4e | ||
|
|
089d3e3f27 | ||
|
|
765b2f0901 | ||
|
|
36c42096e4 | ||
|
|
909554b453 | ||
|
|
33f40bc945 | ||
|
|
17c993f6ef | ||
|
|
6640909780 | ||
|
|
0e859d8955 | ||
|
|
cd8173c7e0 | ||
|
|
8f362c923e | ||
|
|
56a2ebb210 | ||
|
|
6c1c06f6be | ||
|
|
61a27a9f9d | ||
|
|
ee6f2ab1c2 | ||
|
|
4aa587d32b | ||
|
|
4598d5ed7d | ||
|
|
a57500c966 |
26
NEWS.md
26
NEWS.md
@@ -1,3 +1,29 @@
|
|||||||
|
Nov 30th, 2018
|
||||||
|
==============
|
||||||
|
* Version `0.35.0` of the server extension
|
||||||
|
* Now the `mode_type` is working the providers that support it (#536)
|
||||||
|
|
||||||
|
Nov 27th, 2018
|
||||||
|
==============
|
||||||
|
* Version `0.34.2` of the server extension
|
||||||
|
* Fixed bulk geocoding log metrics in order to fix problems in ELK due to the JSON not being standard (#530)
|
||||||
|
|
||||||
|
Nov 22th, 2018
|
||||||
|
==============
|
||||||
|
* Version `0.34.1` of the server extension
|
||||||
|
* Fixed isochrones metrics that increase `success_rows` field for every isochrone generated (#533)
|
||||||
|
|
||||||
|
Oct 31th, 2018
|
||||||
|
==============
|
||||||
|
* Version `0.20.2` of the python library
|
||||||
|
* Added missing provider property to the QPS decorator in other TomTom services
|
||||||
|
* Now we only retry with the properly header coming from TomTom
|
||||||
|
|
||||||
|
Oct 3rd, 2018
|
||||||
|
==============
|
||||||
|
* Version `0.20.1` of the python library
|
||||||
|
* Fix QPS manager to retry with 403 status codes coming from TomTom
|
||||||
|
|
||||||
Sep 13th, 2018
|
Sep 13th, 2018
|
||||||
==============
|
==============
|
||||||
* Version `0.34.0` of the server, and `0.26.0` of the client.
|
* Version `0.34.0` of the server, and `0.26.0` of the client.
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ The following functions provide an isoline generator service, based on time or d
|
|||||||
|
|
||||||
Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of distance (in meters).
|
Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of distance (in meters).
|
||||||
|
|
||||||
|
Note that not all the providers, for example TomTom, provide us a way to define the isoline limit in distance so we need to make some estimations. Due that estimations the produced isolines could not be 100% precise.
|
||||||
|
|
||||||
#### Arguments
|
#### Arguments
|
||||||
|
|
||||||
Name | Type | Description | Accepted values
|
Name | Type | Description | Accepted values
|
||||||
|
|||||||
@@ -81,4 +81,4 @@ The optional value parameters must be passed using the format: `option=value`. N
|
|||||||
|
|
||||||
Name | Type | Description | Accepted values
|
Name | Type | Description | Accepted values
|
||||||
--- | --- | --- | ---
|
--- | --- | --- | ---
|
||||||
`mode_type` | `text` | Type of route calculation | `shortest` (this option only applies to the car transport mode)
|
`mode_type` | `text` | Type of route calculation | `shortest` or `fastest` (this option only applies to the car transport mode)
|
||||||
|
|||||||
221
server/extension/cdb_dataservices_server--0.34.2--0.35.0.sql
Normal file
221
server/extension/cdb_dataservices_server--0.34.2--0.35.0.sql
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES
|
||||||
|
-- Complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
|
\echo Use "ALTER EXTENSION cdb_dataservices_server UPDATE TO '0.35.0'" to load this file. \quit
|
||||||
|
|
||||||
|
-- HERE goes your code to upgrade/downgrade
|
||||||
|
DROP FUNCTION IF EXISTS cdb_dataservices_server._cdb_mapbox_route_with_waypoints(text, text, geometry(Point, 4326)[], text);
|
||||||
|
DROP FUNCTION IF EXISTS cdb_dataservices_server._cdb_tomtom_route_with_waypoints(text, text, geometry(Point, 4326)[], text);
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_mapbox_route_with_waypoints(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
waypoints geometry(Point, 4326)[],
|
||||||
|
mode TEXT,
|
||||||
|
options text[] DEFAULT ARRAY[]::text[],
|
||||||
|
units text DEFAULT 'kilometers')
|
||||||
|
RETURNS cdb_dataservices_server.simple_route AS $$
|
||||||
|
from cartodb_services.tools import ServiceManager
|
||||||
|
from cartodb_services.mapbox import MapboxRouting
|
||||||
|
from cartodb_services.mapbox.types import TRANSPORT_MODE_TO_MAPBOX
|
||||||
|
from cartodb_services.tools import Coordinate
|
||||||
|
from cartodb_services.tools.polyline import polyline_to_linestring
|
||||||
|
from cartodb_services.tools.normalize import options_to_dict
|
||||||
|
from cartodb_services.refactor.service.mapbox_routing_config import MapboxRoutingConfigBuilder
|
||||||
|
|
||||||
|
import cartodb_services
|
||||||
|
cartodb_services.init(plpy, GD)
|
||||||
|
|
||||||
|
service_manager = ServiceManager('routing', MapboxRoutingConfigBuilder, username, orgname, GD)
|
||||||
|
service_manager.assert_within_limits()
|
||||||
|
|
||||||
|
try:
|
||||||
|
client = MapboxRouting(service_manager.config.mapbox_api_key, service_manager.logger, service_manager.config.service_params)
|
||||||
|
|
||||||
|
if not waypoints or len(waypoints) < 2:
|
||||||
|
service_manager.logger.info("Empty origin or destination")
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
|
||||||
|
if len(waypoints) > 25:
|
||||||
|
service_manager.logger.info("Too many waypoints (max 25)")
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
|
||||||
|
waypoint_coords = []
|
||||||
|
for waypoint in waypoints:
|
||||||
|
lat = plpy.execute("SELECT ST_Y('%s') AS lat" % waypoint)[0]['lat']
|
||||||
|
lon = plpy.execute("SELECT ST_X('%s') AS lon" % waypoint)[0]['lon']
|
||||||
|
waypoint_coords.append(Coordinate(lon,lat))
|
||||||
|
|
||||||
|
profile = TRANSPORT_MODE_TO_MAPBOX.get(mode)
|
||||||
|
options_dict = options_to_dict(options)
|
||||||
|
if 'mode_type' in options_dict:
|
||||||
|
plpy.warning('Mapbox provider doesnt support route type parameter')
|
||||||
|
|
||||||
|
resp = client.directions(waypoint_coords, profile)
|
||||||
|
if resp and resp.shape:
|
||||||
|
shape_linestring = polyline_to_linestring(resp.shape)
|
||||||
|
if shape_linestring:
|
||||||
|
service_manager.quota_service.increment_success_service_use()
|
||||||
|
return [shape_linestring, resp.length, int(round(resp.duration))]
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
except BaseException as e:
|
||||||
|
import sys
|
||||||
|
service_manager.quota_service.increment_failed_service_use()
|
||||||
|
service_manager.logger.error('Error trying to calculate Mapbox routing', sys.exc_info(), data={"username": username, "orgname": orgname})
|
||||||
|
raise Exception('Error trying to calculate Mapbox routing')
|
||||||
|
finally:
|
||||||
|
service_manager.quota_service.increment_total_service_use()
|
||||||
|
$$ LANGUAGE plpythonu SECURITY DEFINER STABLE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_tomtom_route_with_waypoints(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
waypoints geometry(Point, 4326)[],
|
||||||
|
mode TEXT,
|
||||||
|
options text[] DEFAULT ARRAY[]::text[],
|
||||||
|
units text DEFAULT 'kilometers')
|
||||||
|
RETURNS cdb_dataservices_server.simple_route AS $$
|
||||||
|
from cartodb_services.tools import ServiceManager
|
||||||
|
from cartodb_services.tomtom import TomTomRouting
|
||||||
|
from cartodb_services.tomtom.types import TRANSPORT_MODE_TO_TOMTOM, DEFAULT_ROUTE_TYPE, MODE_TYPE_TO_TOMTOM
|
||||||
|
from cartodb_services.tools import Coordinate
|
||||||
|
from cartodb_services.tools.polyline import polyline_to_linestring
|
||||||
|
from cartodb_services.tools.normalize import options_to_dict
|
||||||
|
from cartodb_services.refactor.service.tomtom_routing_config import TomTomRoutingConfigBuilder
|
||||||
|
|
||||||
|
import cartodb_services
|
||||||
|
cartodb_services.init(plpy, GD)
|
||||||
|
|
||||||
|
service_manager = ServiceManager('routing', TomTomRoutingConfigBuilder, username, orgname, GD)
|
||||||
|
service_manager.assert_within_limits()
|
||||||
|
|
||||||
|
try:
|
||||||
|
client = TomTomRouting(service_manager.config.tomtom_api_key, service_manager.logger, service_manager.config.service_params)
|
||||||
|
|
||||||
|
if not waypoints or len(waypoints) < 2:
|
||||||
|
service_manager.logger.info("Empty origin or destination")
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
|
||||||
|
if len(waypoints) > 25:
|
||||||
|
service_manager.logger.info("Too many waypoints (max 25)")
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
|
||||||
|
waypoint_coords = []
|
||||||
|
for waypoint in waypoints:
|
||||||
|
lat = plpy.execute("SELECT ST_Y('%s') AS lat" % waypoint)[0]['lat']
|
||||||
|
lon = plpy.execute("SELECT ST_X('%s') AS lon" % waypoint)[0]['lon']
|
||||||
|
waypoint_coords.append(Coordinate(lon,lat))
|
||||||
|
|
||||||
|
profile = TRANSPORT_MODE_TO_TOMTOM.get(mode)
|
||||||
|
route_type = DEFAULT_ROUTE_TYPE
|
||||||
|
options_dict = options_to_dict(options)
|
||||||
|
if 'mode_type' in options_dict:
|
||||||
|
route_type = MODE_TYPE_TO_TOMTOM.get(options_dict['mode_type'])
|
||||||
|
|
||||||
|
resp = client.directions(waypoint_coords, profile=profile, route_type=route_type)
|
||||||
|
if resp and resp.shape:
|
||||||
|
shape_linestring = polyline_to_linestring(resp.shape)
|
||||||
|
if shape_linestring:
|
||||||
|
service_manager.quota_service.increment_success_service_use()
|
||||||
|
return [shape_linestring, resp.length, int(round(resp.duration))]
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
except BaseException as e:
|
||||||
|
import sys
|
||||||
|
service_manager.quota_service.increment_failed_service_use()
|
||||||
|
service_manager.logger.error('Error trying to calculate TomTom routing', sys.exc_info(), data={"username": username, "orgname": orgname})
|
||||||
|
raise Exception('Error trying to calculate TomTom routing')
|
||||||
|
finally:
|
||||||
|
service_manager.quota_service.increment_total_service_use()
|
||||||
|
$$ LANGUAGE plpythonu SECURITY DEFINER STABLE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_route_point_to_point(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
origin geometry(Point, 4326),
|
||||||
|
destination geometry(Point, 4326),
|
||||||
|
mode TEXT,
|
||||||
|
options text[] DEFAULT ARRAY[]::text[],
|
||||||
|
units text DEFAULT 'kilometers')
|
||||||
|
RETURNS cdb_dataservices_server.simple_route AS $$
|
||||||
|
from cartodb_services.metrics import metrics
|
||||||
|
from cartodb_services.tools import Logger
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username))
|
||||||
|
redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection']
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_routing_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname)))
|
||||||
|
user_routing_config = GD["user_routing_config_{0}".format(username)]
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_logger_config()")
|
||||||
|
logger_config = GD["logger_config"]
|
||||||
|
logger = Logger(logger_config)
|
||||||
|
|
||||||
|
params = {'username': username, 'orgname': orgname, 'origin': origin, 'destination': destination, 'mode': mode, 'options': options, 'units': units}
|
||||||
|
|
||||||
|
with metrics('cdb_route_with_point', user_routing_config, logger, params):
|
||||||
|
waypoints = [origin, destination]
|
||||||
|
|
||||||
|
if user_routing_config.mapzen_provider:
|
||||||
|
mapzen_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapzen_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
|
result = plpy.execute(mapzen_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
elif user_routing_config.mapbox_provider:
|
||||||
|
mapbox_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapbox_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
|
result = plpy.execute(mapbox_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
elif user_routing_config.tomtom_provider:
|
||||||
|
tomtom_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_tomtom_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
|
result = plpy.execute(tomtom_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
else:
|
||||||
|
raise Exception('Requested routing method is not available')
|
||||||
|
$$ LANGUAGE plpythonu STABLE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_route_with_waypoints(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
waypoints geometry(Point, 4326)[],
|
||||||
|
mode TEXT,
|
||||||
|
options text[] DEFAULT ARRAY[]::text[],
|
||||||
|
units text DEFAULT 'kilometers')
|
||||||
|
RETURNS cdb_dataservices_server.simple_route AS $$
|
||||||
|
from cartodb_services.metrics import metrics
|
||||||
|
from cartodb_services.tools import Logger
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username))
|
||||||
|
redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection']
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_routing_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname)))
|
||||||
|
user_routing_config = GD["user_routing_config_{0}".format(username)]
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_logger_config()")
|
||||||
|
logger_config = GD["logger_config"]
|
||||||
|
logger = Logger(logger_config)
|
||||||
|
|
||||||
|
params = {'username': username, 'orgname': orgname, 'waypoints': waypoints, 'mode': mode, 'options': options, 'units': units}
|
||||||
|
|
||||||
|
with metrics('cdb_route_with_waypoints', user_routing_config, logger, params):
|
||||||
|
if user_routing_config.mapzen_provider:
|
||||||
|
mapzen_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapzen_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
|
result = plpy.execute(mapzen_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
elif user_routing_config.mapbox_provider:
|
||||||
|
mapbox_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapbox_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
|
result = plpy.execute(mapbox_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
elif user_routing_config.tomtom_provider:
|
||||||
|
tomtom_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_tomtom_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
|
result = plpy.execute(tomtom_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
else:
|
||||||
|
raise Exception('Requested routing method is not available')
|
||||||
|
$$ LANGUAGE plpythonu STABLE PARALLEL RESTRICTED;
|
||||||
209
server/extension/cdb_dataservices_server--0.35.0--0.34.2.sql
Normal file
209
server/extension/cdb_dataservices_server--0.35.0--0.34.2.sql
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES
|
||||||
|
-- Complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
|
\echo Use "ALTER EXTENSION cdb_dataservices_server UPDATE TO '0.34.2'" to load this file. \quit
|
||||||
|
|
||||||
|
-- HERE goes your code to upgrade/downgrade
|
||||||
|
DROP FUNCTION IF EXISTS cdb_dataservices_server._cdb_mapbox_route_with_waypoints(text, text, geometry(Point, 4326)[], text, text[], text);
|
||||||
|
DROP FUNCTION IF EXISTS cdb_dataservices_server._cdb_tomtom_route_with_waypoints(text, text, geometry(Point, 4326)[], text, text[], text);
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_mapbox_route_with_waypoints(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
waypoints geometry(Point, 4326)[],
|
||||||
|
mode TEXT)
|
||||||
|
RETURNS cdb_dataservices_server.simple_route AS $$
|
||||||
|
from cartodb_services.tools import ServiceManager
|
||||||
|
from cartodb_services.mapbox import MapboxRouting
|
||||||
|
from cartodb_services.mapbox.types import TRANSPORT_MODE_TO_MAPBOX
|
||||||
|
from cartodb_services.tools import Coordinate
|
||||||
|
from cartodb_services.tools.polyline import polyline_to_linestring
|
||||||
|
from cartodb_services.refactor.service.mapbox_routing_config import MapboxRoutingConfigBuilder
|
||||||
|
|
||||||
|
import cartodb_services
|
||||||
|
cartodb_services.init(plpy, GD)
|
||||||
|
|
||||||
|
service_manager = ServiceManager('routing', MapboxRoutingConfigBuilder, username, orgname, GD)
|
||||||
|
service_manager.assert_within_limits()
|
||||||
|
|
||||||
|
try:
|
||||||
|
client = MapboxRouting(service_manager.config.mapbox_api_key, service_manager.logger, service_manager.config.service_params)
|
||||||
|
|
||||||
|
if not waypoints or len(waypoints) < 2:
|
||||||
|
service_manager.logger.info("Empty origin or destination")
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
|
||||||
|
if len(waypoints) > 25:
|
||||||
|
service_manager.logger.info("Too many waypoints (max 25)")
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
|
||||||
|
waypoint_coords = []
|
||||||
|
for waypoint in waypoints:
|
||||||
|
lat = plpy.execute("SELECT ST_Y('%s') AS lat" % waypoint)[0]['lat']
|
||||||
|
lon = plpy.execute("SELECT ST_X('%s') AS lon" % waypoint)[0]['lon']
|
||||||
|
waypoint_coords.append(Coordinate(lon,lat))
|
||||||
|
|
||||||
|
profile = TRANSPORT_MODE_TO_MAPBOX.get(mode)
|
||||||
|
|
||||||
|
resp = client.directions(waypoint_coords, profile)
|
||||||
|
if resp and resp.shape:
|
||||||
|
shape_linestring = polyline_to_linestring(resp.shape)
|
||||||
|
if shape_linestring:
|
||||||
|
service_manager.quota_service.increment_success_service_use()
|
||||||
|
return [shape_linestring, resp.length, int(round(resp.duration))]
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
except BaseException as e:
|
||||||
|
import sys
|
||||||
|
service_manager.quota_service.increment_failed_service_use()
|
||||||
|
service_manager.logger.error('Error trying to calculate Mapbox routing', sys.exc_info(), data={"username": username, "orgname": orgname})
|
||||||
|
raise Exception('Error trying to calculate Mapbox routing')
|
||||||
|
finally:
|
||||||
|
service_manager.quota_service.increment_total_service_use()
|
||||||
|
$$ LANGUAGE plpythonu SECURITY DEFINER STABLE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_tomtom_route_with_waypoints(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
waypoints geometry(Point, 4326)[],
|
||||||
|
mode TEXT)
|
||||||
|
RETURNS cdb_dataservices_server.simple_route AS $$
|
||||||
|
from cartodb_services.tools import ServiceManager
|
||||||
|
from cartodb_services.tomtom import TomTomRouting
|
||||||
|
from cartodb_services.tomtom.types import TRANSPORT_MODE_TO_TOMTOM
|
||||||
|
from cartodb_services.tools import Coordinate
|
||||||
|
from cartodb_services.tools.polyline import polyline_to_linestring
|
||||||
|
from cartodb_services.refactor.service.tomtom_routing_config import TomTomRoutingConfigBuilder
|
||||||
|
|
||||||
|
import cartodb_services
|
||||||
|
cartodb_services.init(plpy, GD)
|
||||||
|
|
||||||
|
service_manager = ServiceManager('routing', TomTomRoutingConfigBuilder, username, orgname, GD)
|
||||||
|
service_manager.assert_within_limits()
|
||||||
|
|
||||||
|
try:
|
||||||
|
client = TomTomRouting(service_manager.config.tomtom_api_key, service_manager.logger, service_manager.config.service_params)
|
||||||
|
|
||||||
|
if not waypoints or len(waypoints) < 2:
|
||||||
|
service_manager.logger.info("Empty origin or destination")
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
|
||||||
|
if len(waypoints) > 25:
|
||||||
|
service_manager.logger.info("Too many waypoints (max 25)")
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
|
||||||
|
waypoint_coords = []
|
||||||
|
for waypoint in waypoints:
|
||||||
|
lat = plpy.execute("SELECT ST_Y('%s') AS lat" % waypoint)[0]['lat']
|
||||||
|
lon = plpy.execute("SELECT ST_X('%s') AS lon" % waypoint)[0]['lon']
|
||||||
|
waypoint_coords.append(Coordinate(lon,lat))
|
||||||
|
|
||||||
|
profile = TRANSPORT_MODE_TO_TOMTOM.get(mode)
|
||||||
|
|
||||||
|
resp = client.directions(waypoint_coords, profile)
|
||||||
|
if resp and resp.shape:
|
||||||
|
shape_linestring = polyline_to_linestring(resp.shape)
|
||||||
|
if shape_linestring:
|
||||||
|
service_manager.quota_service.increment_success_service_use()
|
||||||
|
return [shape_linestring, resp.length, int(round(resp.duration))]
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return [None, None, None]
|
||||||
|
except BaseException as e:
|
||||||
|
import sys
|
||||||
|
service_manager.quota_service.increment_failed_service_use()
|
||||||
|
service_manager.logger.error('Error trying to calculate TomTom routing', sys.exc_info(), data={"username": username, "orgname": orgname})
|
||||||
|
raise Exception('Error trying to calculate TomTom routing')
|
||||||
|
finally:
|
||||||
|
service_manager.quota_service.increment_total_service_use()
|
||||||
|
$$ LANGUAGE plpythonu SECURITY DEFINER STABLE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_route_point_to_point(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
origin geometry(Point, 4326),
|
||||||
|
destination geometry(Point, 4326),
|
||||||
|
mode TEXT,
|
||||||
|
options text[] DEFAULT ARRAY[]::text[],
|
||||||
|
units text DEFAULT 'kilometers')
|
||||||
|
RETURNS cdb_dataservices_server.simple_route AS $$
|
||||||
|
from cartodb_services.metrics import metrics
|
||||||
|
from cartodb_services.tools import Logger
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username))
|
||||||
|
redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection']
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_routing_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname)))
|
||||||
|
user_routing_config = GD["user_routing_config_{0}".format(username)]
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_logger_config()")
|
||||||
|
logger_config = GD["logger_config"]
|
||||||
|
logger = Logger(logger_config)
|
||||||
|
|
||||||
|
params = {'username': username, 'orgname': orgname, 'origin': origin, 'destination': destination, 'mode': mode, 'options': options, 'units': units}
|
||||||
|
|
||||||
|
with metrics('cdb_route_with_point', user_routing_config, logger, params):
|
||||||
|
waypoints = [origin, destination]
|
||||||
|
|
||||||
|
if user_routing_config.mapzen_provider:
|
||||||
|
mapzen_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapzen_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
||||||
|
result = plpy.execute(mapzen_plan, [username, orgname, waypoints, mode])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
elif user_routing_config.mapbox_provider:
|
||||||
|
mapbox_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapbox_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
||||||
|
result = plpy.execute(mapbox_plan, [username, orgname, waypoints, mode])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
elif user_routing_config.tomtom_provider:
|
||||||
|
tomtom_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_tomtom_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
||||||
|
result = plpy.execute(tomtom_plan, [username, orgname, waypoints, mode])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
else:
|
||||||
|
raise Exception('Requested routing method is not available')
|
||||||
|
$$ LANGUAGE plpythonu STABLE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server.cdb_route_with_waypoints(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
waypoints geometry(Point, 4326)[],
|
||||||
|
mode TEXT,
|
||||||
|
options text[] DEFAULT ARRAY[]::text[],
|
||||||
|
units text DEFAULT 'kilometers')
|
||||||
|
RETURNS cdb_dataservices_server.simple_route AS $$
|
||||||
|
from cartodb_services.metrics import metrics
|
||||||
|
from cartodb_services.tools import Logger
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username))
|
||||||
|
redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection']
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_routing_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname)))
|
||||||
|
user_routing_config = GD["user_routing_config_{0}".format(username)]
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_logger_config()")
|
||||||
|
logger_config = GD["logger_config"]
|
||||||
|
logger = Logger(logger_config)
|
||||||
|
|
||||||
|
params = {'username': username, 'orgname': orgname, 'waypoints': waypoints, 'mode': mode, 'options': options, 'units': units}
|
||||||
|
|
||||||
|
with metrics('cdb_route_with_waypoints', user_routing_config, logger, params):
|
||||||
|
if user_routing_config.mapzen_provider:
|
||||||
|
mapzen_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapzen_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
||||||
|
result = plpy.execute(mapzen_plan, [username, orgname, waypoints, mode])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
elif user_routing_config.mapbox_provider:
|
||||||
|
mapbox_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapbox_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
||||||
|
result = plpy.execute(mapbox_plan, [username, orgname, waypoints, mode])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
elif user_routing_config.tomtom_provider:
|
||||||
|
tomtom_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_tomtom_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
||||||
|
result = plpy.execute(tomtom_plan, [username, orgname, waypoints, mode])
|
||||||
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
|
else:
|
||||||
|
raise Exception('Requested routing method is not available')
|
||||||
|
$$ LANGUAGE plpythonu STABLE PARALLEL RESTRICTED;
|
||||||
3808
server/extension/cdb_dataservices_server--0.35.0.sql
Normal file
3808
server/extension/cdb_dataservices_server--0.35.0.sql
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
comment = 'CartoDB dataservices server extension'
|
comment = 'CartoDB dataservices server extension'
|
||||||
default_version = '0.34.0'
|
default_version = '0.35.0'
|
||||||
requires = 'plpythonu, plproxy, postgis, cdb_geocoder'
|
requires = 'plpythonu, plproxy, postgis, cdb_geocoder'
|
||||||
superuser = true
|
superuser = true
|
||||||
schema = cdb_dataservices_server
|
schema = cdb_dataservices_server
|
||||||
|
|||||||
@@ -0,0 +1,182 @@
|
|||||||
|
--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES
|
||||||
|
-- Complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
|
\echo Use "ALTER EXTENSION cdb_dataservices_server UPDATE TO '0.34.1'" to load this file. \quit
|
||||||
|
|
||||||
|
-- HERE goes your code to upgrade/downgrade
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_mapzen_isochrones(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
source geometry(Geometry, 4326),
|
||||||
|
mode TEXT,
|
||||||
|
data_range integer[],
|
||||||
|
options text[])
|
||||||
|
RETURNS SETOF cdb_dataservices_server.isoline AS $$
|
||||||
|
import json
|
||||||
|
from cartodb_services.mapzen import MatrixClient, MapzenIsochrones
|
||||||
|
from cartodb_services.metrics import QuotaService
|
||||||
|
from cartodb_services.tools import Logger,LoggerConfig
|
||||||
|
from cartodb_services.mapzen.types import coordinates_to_polygon
|
||||||
|
|
||||||
|
redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection']
|
||||||
|
user_isolines_routing_config = GD["user_isolines_routing_config_{0}".format(username)]
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_logger_config()")
|
||||||
|
logger_config = GD["logger_config"]
|
||||||
|
logger = Logger(logger_config)
|
||||||
|
# -- Check the quota
|
||||||
|
quota_service = QuotaService(user_isolines_routing_config, redis_conn)
|
||||||
|
if not quota_service.check_user_quota():
|
||||||
|
raise Exception('You have reached the limit of your quota')
|
||||||
|
|
||||||
|
try:
|
||||||
|
mapzen_isochrones = MapzenIsochrones(user_isolines_routing_config.mapzen_matrix_api_key,
|
||||||
|
logger, user_isolines_routing_config.mapzen_isochrones_service_params)
|
||||||
|
|
||||||
|
if source:
|
||||||
|
lat = plpy.execute("SELECT ST_Y('%s') AS lat" % source)[0]['lat']
|
||||||
|
lon = plpy.execute("SELECT ST_X('%s') AS lon" % source)[0]['lon']
|
||||||
|
origin = {'lat': lat, 'lon': lon}
|
||||||
|
else:
|
||||||
|
raise Exception('source is NULL')
|
||||||
|
|
||||||
|
resp = mapzen_isochrones.isochrone(origin, mode, data_range)
|
||||||
|
|
||||||
|
if resp:
|
||||||
|
result = []
|
||||||
|
for isochrone in resp:
|
||||||
|
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
||||||
|
if result_polygon:
|
||||||
|
result.append([source, isochrone.duration, result_polygon])
|
||||||
|
else:
|
||||||
|
result.append([source, isochrone.duration, None])
|
||||||
|
quota_service.increment_success_service_use()
|
||||||
|
quota_service.increment_isolines_service_use(len(result))
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
quota_service.increment_empty_service_use()
|
||||||
|
return []
|
||||||
|
except BaseException as e:
|
||||||
|
import sys
|
||||||
|
quota_service.increment_failed_service_use()
|
||||||
|
logger.error('Error trying to get mapzen isochrones', sys.exc_info(), data={"username": username, "orgname": orgname})
|
||||||
|
raise Exception('Error trying to get mapzen isochrones')
|
||||||
|
finally:
|
||||||
|
quota_service.increment_total_service_use()
|
||||||
|
$$ LANGUAGE plpythonu SECURITY DEFINER STABLE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_mapbox_isochrones(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
source geometry(Geometry, 4326),
|
||||||
|
mode TEXT,
|
||||||
|
data_range integer[],
|
||||||
|
options text[])
|
||||||
|
RETURNS SETOF cdb_dataservices_server.isoline AS $$
|
||||||
|
from cartodb_services.tools import ServiceManager
|
||||||
|
from cartodb_services.mapbox import MapboxMatrixClient, MapboxIsolines
|
||||||
|
from cartodb_services.mapbox.types import TRANSPORT_MODE_TO_MAPBOX
|
||||||
|
from cartodb_services.tools import Coordinate
|
||||||
|
from cartodb_services.tools.coordinates import coordinates_to_polygon
|
||||||
|
from cartodb_services.refactor.service.mapbox_isolines_config import MapboxIsolinesConfigBuilder
|
||||||
|
|
||||||
|
import cartodb_services
|
||||||
|
cartodb_services.init(plpy, GD)
|
||||||
|
|
||||||
|
service_manager = ServiceManager('isolines', MapboxIsolinesConfigBuilder, username, orgname, GD)
|
||||||
|
service_manager.assert_within_limits()
|
||||||
|
|
||||||
|
try:
|
||||||
|
client = MapboxMatrixClient(service_manager.config.mapbox_api_key, service_manager.logger, service_manager.config.service_params)
|
||||||
|
mapbox_isolines = MapboxIsolines(client, service_manager.logger)
|
||||||
|
|
||||||
|
if source:
|
||||||
|
lat = plpy.execute("SELECT ST_Y('%s') AS lat" % source)[0]['lat']
|
||||||
|
lon = plpy.execute("SELECT ST_X('%s') AS lon" % source)[0]['lon']
|
||||||
|
origin = Coordinate(lon,lat)
|
||||||
|
else:
|
||||||
|
raise Exception('source is NULL')
|
||||||
|
|
||||||
|
profile = TRANSPORT_MODE_TO_MAPBOX.get(mode)
|
||||||
|
|
||||||
|
resp = mapbox_isolines.calculate_isochrone(origin, data_range, profile)
|
||||||
|
|
||||||
|
if resp:
|
||||||
|
result = []
|
||||||
|
for isochrone in resp:
|
||||||
|
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
||||||
|
if result_polygon:
|
||||||
|
result.append([source, isochrone.duration, result_polygon])
|
||||||
|
else:
|
||||||
|
result.append([source, isochrone.duration, None])
|
||||||
|
service_manager.quota_service.increment_success_service_use()
|
||||||
|
service_manager.quota_service.increment_isolines_service_use(len(result))
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return []
|
||||||
|
except BaseException as e:
|
||||||
|
import sys
|
||||||
|
service_manager.quota_service.increment_failed_service_use()
|
||||||
|
service_manager.logger.error('Error trying to get Mapbox isochrones', sys.exc_info(), data={"username": username, "orgname": orgname})
|
||||||
|
raise Exception('Error trying to get Mapbox isochrones')
|
||||||
|
finally:
|
||||||
|
service_manager.quota_service.increment_total_service_use()
|
||||||
|
$$ LANGUAGE plpythonu SECURITY DEFINER STABLE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_tomtom_isochrones(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
source geometry(Geometry, 4326),
|
||||||
|
mode TEXT,
|
||||||
|
data_range integer[],
|
||||||
|
options text[])
|
||||||
|
RETURNS SETOF cdb_dataservices_server.isoline AS $$
|
||||||
|
from cartodb_services.tools import ServiceManager
|
||||||
|
from cartodb_services.tomtom import TomTomIsolines
|
||||||
|
from cartodb_services.tomtom.types import TRANSPORT_MODE_TO_TOMTOM
|
||||||
|
from cartodb_services.tools import Coordinate
|
||||||
|
from cartodb_services.tools.coordinates import coordinates_to_polygon
|
||||||
|
from cartodb_services.refactor.service.tomtom_isolines_config import TomTomIsolinesConfigBuilder
|
||||||
|
|
||||||
|
import cartodb_services
|
||||||
|
cartodb_services.init(plpy, GD)
|
||||||
|
|
||||||
|
service_manager = ServiceManager('isolines', TomTomIsolinesConfigBuilder, username, orgname, GD)
|
||||||
|
service_manager.assert_within_limits()
|
||||||
|
|
||||||
|
try:
|
||||||
|
tomtom_isolines = TomTomIsolines(service_manager.config.tomtom_api_key, service_manager.logger, service_manager.config.service_params)
|
||||||
|
|
||||||
|
if source:
|
||||||
|
lat = plpy.execute("SELECT ST_Y('%s') AS lat" % source)[0]['lat']
|
||||||
|
lon = plpy.execute("SELECT ST_X('%s') AS lon" % source)[0]['lon']
|
||||||
|
origin = Coordinate(lon,lat)
|
||||||
|
else:
|
||||||
|
raise Exception('source is NULL')
|
||||||
|
|
||||||
|
profile = TRANSPORT_MODE_TO_TOMTOM.get(mode)
|
||||||
|
|
||||||
|
resp = tomtom_isolines.calculate_isochrone(origin, data_range, profile)
|
||||||
|
|
||||||
|
if resp:
|
||||||
|
result = []
|
||||||
|
for isochrone in resp:
|
||||||
|
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
||||||
|
if result_polygon:
|
||||||
|
result.append([source, isochrone.duration, result_polygon])
|
||||||
|
else:
|
||||||
|
result.append([source, isochrone.duration, None])
|
||||||
|
service_manager.quota_service.increment_success_service_use()
|
||||||
|
service_manager.quota_service.increment_isolines_service_use(len(result))
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return []
|
||||||
|
except BaseException as e:
|
||||||
|
import sys
|
||||||
|
service_manager.quota_service.increment_failed_service_use()
|
||||||
|
service_manager.logger.error('Error trying to get TomTom isochrones', sys.exc_info(), data={"username": username, "orgname": orgname})
|
||||||
|
raise Exception('Error trying to get TomTom isochrones')
|
||||||
|
finally:
|
||||||
|
service_manager.quota_service.increment_total_service_use()
|
||||||
|
$$ LANGUAGE plpythonu SECURITY DEFINER STABLE PARALLEL RESTRICTED;
|
||||||
@@ -0,0 +1,188 @@
|
|||||||
|
--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES
|
||||||
|
-- Complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
|
\echo Use "ALTER EXTENSION cdb_dataservices_server UPDATE TO '0.34.0'" to load this file. \quit
|
||||||
|
|
||||||
|
-- HERE goes your code to upgrade/downgrade
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_mapzen_isochrones(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
source geometry(Geometry, 4326),
|
||||||
|
mode TEXT,
|
||||||
|
data_range integer[],
|
||||||
|
options text[])
|
||||||
|
RETURNS SETOF cdb_dataservices_server.isoline AS $$
|
||||||
|
import json
|
||||||
|
from cartodb_services.mapzen import MatrixClient, MapzenIsochrones
|
||||||
|
from cartodb_services.metrics import QuotaService
|
||||||
|
from cartodb_services.tools import Logger,LoggerConfig
|
||||||
|
from cartodb_services.mapzen.types import coordinates_to_polygon
|
||||||
|
|
||||||
|
redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection']
|
||||||
|
user_isolines_routing_config = GD["user_isolines_routing_config_{0}".format(username)]
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_logger_config()")
|
||||||
|
logger_config = GD["logger_config"]
|
||||||
|
logger = Logger(logger_config)
|
||||||
|
# -- Check the quota
|
||||||
|
quota_service = QuotaService(user_isolines_routing_config, redis_conn)
|
||||||
|
if not quota_service.check_user_quota():
|
||||||
|
raise Exception('You have reached the limit of your quota')
|
||||||
|
|
||||||
|
try:
|
||||||
|
mapzen_isochrones = MapzenIsochrones(user_isolines_routing_config.mapzen_matrix_api_key,
|
||||||
|
logger, user_isolines_routing_config.mapzen_isochrones_service_params)
|
||||||
|
|
||||||
|
if source:
|
||||||
|
lat = plpy.execute("SELECT ST_Y('%s') AS lat" % source)[0]['lat']
|
||||||
|
lon = plpy.execute("SELECT ST_X('%s') AS lon" % source)[0]['lon']
|
||||||
|
origin = {'lat': lat, 'lon': lon}
|
||||||
|
else:
|
||||||
|
raise Exception('source is NULL')
|
||||||
|
|
||||||
|
resp = mapzen_isochrones.isochrone(origin, mode, data_range)
|
||||||
|
|
||||||
|
if resp:
|
||||||
|
result = []
|
||||||
|
for isochrone in resp:
|
||||||
|
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
||||||
|
if result_polygon:
|
||||||
|
quota_service.increment_success_service_use()
|
||||||
|
result.append([source, isochrone.duration, result_polygon])
|
||||||
|
else:
|
||||||
|
quota_service.increment_empty_service_use()
|
||||||
|
result.append([source, isochrone.duration, None])
|
||||||
|
quota_service.increment_success_service_use()
|
||||||
|
quota_service.increment_isolines_service_use(len(result))
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
quota_service.increment_empty_service_use()
|
||||||
|
return []
|
||||||
|
except BaseException as e:
|
||||||
|
import sys
|
||||||
|
quota_service.increment_failed_service_use()
|
||||||
|
logger.error('Error trying to get mapzen isochrones', sys.exc_info(), data={"username": username, "orgname": orgname})
|
||||||
|
raise Exception('Error trying to get mapzen isochrones')
|
||||||
|
finally:
|
||||||
|
quota_service.increment_total_service_use()
|
||||||
|
$$ LANGUAGE plpythonu SECURITY DEFINER STABLE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_mapbox_isochrones(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
source geometry(Geometry, 4326),
|
||||||
|
mode TEXT,
|
||||||
|
data_range integer[],
|
||||||
|
options text[])
|
||||||
|
RETURNS SETOF cdb_dataservices_server.isoline AS $$
|
||||||
|
from cartodb_services.tools import ServiceManager
|
||||||
|
from cartodb_services.mapbox import MapboxMatrixClient, MapboxIsolines
|
||||||
|
from cartodb_services.mapbox.types import TRANSPORT_MODE_TO_MAPBOX
|
||||||
|
from cartodb_services.tools import Coordinate
|
||||||
|
from cartodb_services.tools.coordinates import coordinates_to_polygon
|
||||||
|
from cartodb_services.refactor.service.mapbox_isolines_config import MapboxIsolinesConfigBuilder
|
||||||
|
|
||||||
|
import cartodb_services
|
||||||
|
cartodb_services.init(plpy, GD)
|
||||||
|
|
||||||
|
service_manager = ServiceManager('isolines', MapboxIsolinesConfigBuilder, username, orgname, GD)
|
||||||
|
service_manager.assert_within_limits()
|
||||||
|
|
||||||
|
try:
|
||||||
|
client = MapboxMatrixClient(service_manager.config.mapbox_api_key, service_manager.logger, service_manager.config.service_params)
|
||||||
|
mapbox_isolines = MapboxIsolines(client, service_manager.logger)
|
||||||
|
|
||||||
|
if source:
|
||||||
|
lat = plpy.execute("SELECT ST_Y('%s') AS lat" % source)[0]['lat']
|
||||||
|
lon = plpy.execute("SELECT ST_X('%s') AS lon" % source)[0]['lon']
|
||||||
|
origin = Coordinate(lon,lat)
|
||||||
|
else:
|
||||||
|
raise Exception('source is NULL')
|
||||||
|
|
||||||
|
profile = TRANSPORT_MODE_TO_MAPBOX.get(mode)
|
||||||
|
|
||||||
|
resp = mapbox_isolines.calculate_isochrone(origin, data_range, profile)
|
||||||
|
|
||||||
|
if resp:
|
||||||
|
result = []
|
||||||
|
for isochrone in resp:
|
||||||
|
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
||||||
|
if result_polygon:
|
||||||
|
service_manager.quota_service.increment_success_service_use()
|
||||||
|
result.append([source, isochrone.duration, result_polygon])
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
result.append([source, isochrone.duration, None])
|
||||||
|
service_manager.quota_service.increment_success_service_use()
|
||||||
|
service_manager.quota_service.increment_isolines_service_use(len(result))
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return []
|
||||||
|
except BaseException as e:
|
||||||
|
import sys
|
||||||
|
service_manager.quota_service.increment_failed_service_use()
|
||||||
|
service_manager.logger.error('Error trying to get Mapbox isochrones', sys.exc_info(), data={"username": username, "orgname": orgname})
|
||||||
|
raise Exception('Error trying to get Mapbox isochrones')
|
||||||
|
finally:
|
||||||
|
service_manager.quota_service.increment_total_service_use()
|
||||||
|
$$ LANGUAGE plpythonu SECURITY DEFINER STABLE PARALLEL RESTRICTED;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_tomtom_isochrones(
|
||||||
|
username TEXT,
|
||||||
|
orgname TEXT,
|
||||||
|
source geometry(Geometry, 4326),
|
||||||
|
mode TEXT,
|
||||||
|
data_range integer[],
|
||||||
|
options text[])
|
||||||
|
RETURNS SETOF cdb_dataservices_server.isoline AS $$
|
||||||
|
from cartodb_services.tools import ServiceManager
|
||||||
|
from cartodb_services.tomtom import TomTomIsolines
|
||||||
|
from cartodb_services.tomtom.types import TRANSPORT_MODE_TO_TOMTOM
|
||||||
|
from cartodb_services.tools import Coordinate
|
||||||
|
from cartodb_services.tools.coordinates import coordinates_to_polygon
|
||||||
|
from cartodb_services.refactor.service.tomtom_isolines_config import TomTomIsolinesConfigBuilder
|
||||||
|
|
||||||
|
import cartodb_services
|
||||||
|
cartodb_services.init(plpy, GD)
|
||||||
|
|
||||||
|
service_manager = ServiceManager('isolines', TomTomIsolinesConfigBuilder, username, orgname, GD)
|
||||||
|
service_manager.assert_within_limits()
|
||||||
|
|
||||||
|
try:
|
||||||
|
tomtom_isolines = TomTomIsolines(service_manager.config.tomtom_api_key, service_manager.logger, service_manager.config.service_params)
|
||||||
|
|
||||||
|
if source:
|
||||||
|
lat = plpy.execute("SELECT ST_Y('%s') AS lat" % source)[0]['lat']
|
||||||
|
lon = plpy.execute("SELECT ST_X('%s') AS lon" % source)[0]['lon']
|
||||||
|
origin = Coordinate(lon,lat)
|
||||||
|
else:
|
||||||
|
raise Exception('source is NULL')
|
||||||
|
|
||||||
|
profile = TRANSPORT_MODE_TO_TOMTOM.get(mode)
|
||||||
|
|
||||||
|
resp = tomtom_isolines.calculate_isochrone(origin, data_range, profile)
|
||||||
|
|
||||||
|
if resp:
|
||||||
|
result = []
|
||||||
|
for isochrone in resp:
|
||||||
|
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
||||||
|
if result_polygon:
|
||||||
|
service_manager.quota_service.increment_success_service_use()
|
||||||
|
result.append([source, isochrone.duration, result_polygon])
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
result.append([source, isochrone.duration, None])
|
||||||
|
service_manager.quota_service.increment_success_service_use()
|
||||||
|
service_manager.quota_service.increment_isolines_service_use(len(result))
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
service_manager.quota_service.increment_empty_service_use()
|
||||||
|
return []
|
||||||
|
except BaseException as e:
|
||||||
|
import sys
|
||||||
|
service_manager.quota_service.increment_failed_service_use()
|
||||||
|
service_manager.logger.error('Error trying to get TomTom isochrones', sys.exc_info(), data={"username": username, "orgname": orgname})
|
||||||
|
raise Exception('Error trying to get TomTom isochrones')
|
||||||
|
finally:
|
||||||
|
service_manager.quota_service.increment_total_service_use()
|
||||||
|
$$ LANGUAGE plpythonu SECURITY DEFINER STABLE PARALLEL RESTRICTED;
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES
|
||||||
|
-- Complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
|
\echo Use "ALTER EXTENSION cdb_dataservices_server UPDATE TO '0.34.1'" to load this file. \quit
|
||||||
|
|
||||||
|
-- HERE goes your code to upgrade/downgrade
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_bulk_geocode_street_point(username TEXT, orgname TEXT, searches jsonb)
|
||||||
|
RETURNS SETOF cdb_dataservices_server.geocoding AS $$
|
||||||
|
from cartodb_services.metrics import metrics
|
||||||
|
from cartodb_services.tools import Logger
|
||||||
|
import json
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username))
|
||||||
|
redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection']
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname)))
|
||||||
|
user_geocoder_config = GD["user_geocoder_config_{0}".format(username)]
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_logger_config()")
|
||||||
|
logger_config = GD["logger_config"]
|
||||||
|
logger = Logger(logger_config)
|
||||||
|
|
||||||
|
params = {'username': username, 'orgname': orgname, 'searches': json.loads(searches)}
|
||||||
|
|
||||||
|
with metrics('cdb_bulk_geocode_street_point', user_geocoder_config, logger, params):
|
||||||
|
if user_geocoder_config.google_geocoder:
|
||||||
|
provider_function = "_cdb_bulk_google_geocode_street_point";
|
||||||
|
elif user_geocoder_config.heremaps_geocoder:
|
||||||
|
provider_function = "_cdb_bulk_heremaps_geocode_street_point";
|
||||||
|
elif user_geocoder_config.tomtom_geocoder:
|
||||||
|
provider_function = "_cdb_bulk_tomtom_geocode_street_point";
|
||||||
|
elif user_geocoder_config.mapbox_geocoder:
|
||||||
|
provider_function = "_cdb_bulk_mapbox_geocode_street_point";
|
||||||
|
else:
|
||||||
|
raise Exception('Requested geocoder is not available')
|
||||||
|
|
||||||
|
plan = plpy.prepare("SELECT * FROM cdb_dataservices_server.{}($1, $2, $3); ".format(provider_function), ["text", "text", "jsonb"])
|
||||||
|
return plpy.execute(plan, [username, orgname, searches])
|
||||||
|
|
||||||
|
$$ LANGUAGE plpythonu STABLE PARALLEL RESTRICTED;
|
||||||
3794
server/extension/old_versions/cdb_dataservices_server--0.34.1.sql
Normal file
3794
server/extension/old_versions/cdb_dataservices_server--0.34.1.sql
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,39 @@
|
|||||||
|
--DO NOT MODIFY THIS FILE, IT IS GENERATED AUTOMATICALLY FROM SOURCES
|
||||||
|
-- Complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||||
|
\echo Use "ALTER EXTENSION cdb_dataservices_server UPDATE TO '0.34.0'" to load this file. \quit
|
||||||
|
|
||||||
|
-- HERE goes your code to upgrade/downgrade
|
||||||
|
CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_bulk_geocode_street_point(username TEXT, orgname TEXT, searches jsonb)
|
||||||
|
RETURNS SETOF cdb_dataservices_server.geocoding AS $$
|
||||||
|
from cartodb_services.metrics import metrics
|
||||||
|
from cartodb_services.tools import Logger
|
||||||
|
import json
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username))
|
||||||
|
redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection']
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_geocoder_config({0}, {1})".format(plpy.quote_nullable(username), plpy.quote_nullable(orgname)))
|
||||||
|
user_geocoder_config = GD["user_geocoder_config_{0}".format(username)]
|
||||||
|
|
||||||
|
plpy.execute("SELECT cdb_dataservices_server._get_logger_config()")
|
||||||
|
logger_config = GD["logger_config"]
|
||||||
|
logger = Logger(logger_config)
|
||||||
|
|
||||||
|
params = {'username': username, 'orgname': orgname, 'searches': searches}
|
||||||
|
|
||||||
|
with metrics('cdb_bulk_geocode_street_point', user_geocoder_config, logger, params):
|
||||||
|
if user_geocoder_config.google_geocoder:
|
||||||
|
provider_function = "_cdb_bulk_google_geocode_street_point";
|
||||||
|
elif user_geocoder_config.heremaps_geocoder:
|
||||||
|
provider_function = "_cdb_bulk_heremaps_geocode_street_point";
|
||||||
|
elif user_geocoder_config.tomtom_geocoder:
|
||||||
|
provider_function = "_cdb_bulk_tomtom_geocode_street_point";
|
||||||
|
elif user_geocoder_config.mapbox_geocoder:
|
||||||
|
provider_function = "_cdb_bulk_mapbox_geocode_street_point";
|
||||||
|
else:
|
||||||
|
raise Exception('Requested geocoder is not available')
|
||||||
|
|
||||||
|
plan = plpy.prepare("SELECT * FROM cdb_dataservices_server.{}($1, $2, $3); ".format(provider_function), ["text", "text", "jsonb"])
|
||||||
|
return plpy.execute(plan, [username, orgname, searches])
|
||||||
|
|
||||||
|
$$ LANGUAGE plpythonu STABLE PARALLEL RESTRICTED;
|
||||||
3795
server/extension/old_versions/cdb_dataservices_server--0.34.2.sql
Normal file
3795
server/extension/old_versions/cdb_dataservices_server--0.34.2.sql
Normal file
File diff suppressed because it is too large
Load Diff
@@ -8,13 +8,16 @@ CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_mapbox_route_with_waypoi
|
|||||||
username TEXT,
|
username TEXT,
|
||||||
orgname TEXT,
|
orgname TEXT,
|
||||||
waypoints geometry(Point, 4326)[],
|
waypoints geometry(Point, 4326)[],
|
||||||
mode TEXT)
|
mode TEXT,
|
||||||
|
options text[] DEFAULT ARRAY[]::text[],
|
||||||
|
units text DEFAULT 'kilometers')
|
||||||
RETURNS cdb_dataservices_server.simple_route AS $$
|
RETURNS cdb_dataservices_server.simple_route AS $$
|
||||||
from cartodb_services.tools import ServiceManager
|
from cartodb_services.tools import ServiceManager
|
||||||
from cartodb_services.mapbox import MapboxRouting
|
from cartodb_services.mapbox import MapboxRouting
|
||||||
from cartodb_services.mapbox.types import TRANSPORT_MODE_TO_MAPBOX
|
from cartodb_services.mapbox.types import TRANSPORT_MODE_TO_MAPBOX
|
||||||
from cartodb_services.tools import Coordinate
|
from cartodb_services.tools import Coordinate
|
||||||
from cartodb_services.tools.polyline import polyline_to_linestring
|
from cartodb_services.tools.polyline import polyline_to_linestring
|
||||||
|
from cartodb_services.tools.normalize import options_to_dict
|
||||||
from cartodb_services.refactor.service.mapbox_routing_config import MapboxRoutingConfigBuilder
|
from cartodb_services.refactor.service.mapbox_routing_config import MapboxRoutingConfigBuilder
|
||||||
|
|
||||||
import cartodb_services
|
import cartodb_services
|
||||||
@@ -43,6 +46,9 @@ RETURNS cdb_dataservices_server.simple_route AS $$
|
|||||||
waypoint_coords.append(Coordinate(lon,lat))
|
waypoint_coords.append(Coordinate(lon,lat))
|
||||||
|
|
||||||
profile = TRANSPORT_MODE_TO_MAPBOX.get(mode)
|
profile = TRANSPORT_MODE_TO_MAPBOX.get(mode)
|
||||||
|
options_dict = options_to_dict(options)
|
||||||
|
if 'mode_type' in options_dict:
|
||||||
|
plpy.warning('Mapbox provider doesnt support route type parameter')
|
||||||
|
|
||||||
resp = client.directions(waypoint_coords, profile)
|
resp = client.directions(waypoint_coords, profile)
|
||||||
if resp and resp.shape:
|
if resp and resp.shape:
|
||||||
@@ -69,13 +75,16 @@ CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_tomtom_route_with_waypoi
|
|||||||
username TEXT,
|
username TEXT,
|
||||||
orgname TEXT,
|
orgname TEXT,
|
||||||
waypoints geometry(Point, 4326)[],
|
waypoints geometry(Point, 4326)[],
|
||||||
mode TEXT)
|
mode TEXT,
|
||||||
|
options text[] DEFAULT ARRAY[]::text[],
|
||||||
|
units text DEFAULT 'kilometers')
|
||||||
RETURNS cdb_dataservices_server.simple_route AS $$
|
RETURNS cdb_dataservices_server.simple_route AS $$
|
||||||
from cartodb_services.tools import ServiceManager
|
from cartodb_services.tools import ServiceManager
|
||||||
from cartodb_services.tomtom import TomTomRouting
|
from cartodb_services.tomtom import TomTomRouting
|
||||||
from cartodb_services.tomtom.types import TRANSPORT_MODE_TO_TOMTOM
|
from cartodb_services.tomtom.types import TRANSPORT_MODE_TO_TOMTOM, DEFAULT_ROUTE_TYPE, MODE_TYPE_TO_TOMTOM
|
||||||
from cartodb_services.tools import Coordinate
|
from cartodb_services.tools import Coordinate
|
||||||
from cartodb_services.tools.polyline import polyline_to_linestring
|
from cartodb_services.tools.polyline import polyline_to_linestring
|
||||||
|
from cartodb_services.tools.normalize import options_to_dict
|
||||||
from cartodb_services.refactor.service.tomtom_routing_config import TomTomRoutingConfigBuilder
|
from cartodb_services.refactor.service.tomtom_routing_config import TomTomRoutingConfigBuilder
|
||||||
|
|
||||||
import cartodb_services
|
import cartodb_services
|
||||||
@@ -104,8 +113,12 @@ RETURNS cdb_dataservices_server.simple_route AS $$
|
|||||||
waypoint_coords.append(Coordinate(lon,lat))
|
waypoint_coords.append(Coordinate(lon,lat))
|
||||||
|
|
||||||
profile = TRANSPORT_MODE_TO_TOMTOM.get(mode)
|
profile = TRANSPORT_MODE_TO_TOMTOM.get(mode)
|
||||||
|
route_type = DEFAULT_ROUTE_TYPE
|
||||||
|
options_dict = options_to_dict(options)
|
||||||
|
if 'mode_type' in options_dict:
|
||||||
|
route_type = MODE_TYPE_TO_TOMTOM.get(options_dict['mode_type'])
|
||||||
|
|
||||||
resp = client.directions(waypoint_coords, profile)
|
resp = client.directions(waypoint_coords, profile=profile, route_type=route_type)
|
||||||
if resp and resp.shape:
|
if resp and resp.shape:
|
||||||
shape_linestring = polyline_to_linestring(resp.shape)
|
shape_linestring = polyline_to_linestring(resp.shape)
|
||||||
if shape_linestring:
|
if shape_linestring:
|
||||||
|
|||||||
@@ -24,16 +24,16 @@ RETURNS cdb_dataservices_server.simple_route AS $$
|
|||||||
waypoints = [origin, destination]
|
waypoints = [origin, destination]
|
||||||
|
|
||||||
if user_routing_config.mapzen_provider:
|
if user_routing_config.mapzen_provider:
|
||||||
mapzen_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapzen_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
mapzen_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapzen_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
result = plpy.execute(mapzen_plan, [username, orgname, waypoints, mode])
|
result = plpy.execute(mapzen_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
elif user_routing_config.mapbox_provider:
|
elif user_routing_config.mapbox_provider:
|
||||||
mapbox_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapbox_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
mapbox_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapbox_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
result = plpy.execute(mapbox_plan, [username, orgname, waypoints, mode])
|
result = plpy.execute(mapbox_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
elif user_routing_config.tomtom_provider:
|
elif user_routing_config.tomtom_provider:
|
||||||
tomtom_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_tomtom_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
tomtom_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_tomtom_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
result = plpy.execute(tomtom_plan, [username, orgname, waypoints, mode])
|
result = plpy.execute(tomtom_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
else:
|
else:
|
||||||
raise Exception('Requested routing method is not available')
|
raise Exception('Requested routing method is not available')
|
||||||
@@ -63,16 +63,16 @@ RETURNS cdb_dataservices_server.simple_route AS $$
|
|||||||
|
|
||||||
with metrics('cdb_route_with_waypoints', user_routing_config, logger, params):
|
with metrics('cdb_route_with_waypoints', user_routing_config, logger, params):
|
||||||
if user_routing_config.mapzen_provider:
|
if user_routing_config.mapzen_provider:
|
||||||
mapzen_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapzen_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
mapzen_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapzen_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
result = plpy.execute(mapzen_plan, [username, orgname, waypoints, mode])
|
result = plpy.execute(mapzen_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
elif user_routing_config.mapbox_provider:
|
elif user_routing_config.mapbox_provider:
|
||||||
mapbox_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapbox_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
mapbox_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_mapbox_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
result = plpy.execute(mapbox_plan, [username, orgname, waypoints, mode])
|
result = plpy.execute(mapbox_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
elif user_routing_config.tomtom_provider:
|
elif user_routing_config.tomtom_provider:
|
||||||
tomtom_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_tomtom_route_with_waypoints($1, $2, $3, $4) as route;", ["text", "text", "geometry(Point, 4326)[]", "text"])
|
tomtom_plan = plpy.prepare("SELECT * FROM cdb_dataservices_server._cdb_tomtom_route_with_waypoints($1, $2, $3, $4, $5, $6) as route;", ["text", "text", "geometry(Point, 4326)[]", "text", "text[]", "text"])
|
||||||
result = plpy.execute(tomtom_plan, [username, orgname, waypoints, mode])
|
result = plpy.execute(tomtom_plan, [username, orgname, waypoints, mode, options, units])
|
||||||
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
return [result[0]['shape'],result[0]['length'], result[0]['duration']]
|
||||||
else:
|
else:
|
||||||
raise Exception('Requested routing method is not available')
|
raise Exception('Requested routing method is not available')
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ CREATE OR REPLACE FUNCTION cdb_dataservices_server._cdb_bulk_geocode_street_poin
|
|||||||
RETURNS SETOF cdb_dataservices_server.geocoding AS $$
|
RETURNS SETOF cdb_dataservices_server.geocoding AS $$
|
||||||
from cartodb_services.metrics import metrics
|
from cartodb_services.metrics import metrics
|
||||||
from cartodb_services.tools import Logger
|
from cartodb_services.tools import Logger
|
||||||
|
import json
|
||||||
|
|
||||||
plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username))
|
plpy.execute("SELECT cdb_dataservices_server._connect_to_redis('{0}')".format(username))
|
||||||
redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection']
|
redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection']
|
||||||
@@ -20,7 +21,7 @@ RETURNS SETOF cdb_dataservices_server.geocoding AS $$
|
|||||||
logger_config = GD["logger_config"]
|
logger_config = GD["logger_config"]
|
||||||
logger = Logger(logger_config)
|
logger = Logger(logger_config)
|
||||||
|
|
||||||
params = {'username': username, 'orgname': orgname, 'searches': searches}
|
params = {'username': username, 'orgname': orgname, 'searches': json.loads(searches)}
|
||||||
|
|
||||||
with metrics('cdb_bulk_geocode_street_point', user_geocoder_config, logger, params):
|
with metrics('cdb_bulk_geocode_street_point', user_geocoder_config, logger, params):
|
||||||
if user_geocoder_config.google_geocoder:
|
if user_geocoder_config.google_geocoder:
|
||||||
|
|||||||
@@ -295,10 +295,8 @@ RETURNS SETOF cdb_dataservices_server.isoline AS $$
|
|||||||
for isochrone in resp:
|
for isochrone in resp:
|
||||||
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
||||||
if result_polygon:
|
if result_polygon:
|
||||||
quota_service.increment_success_service_use()
|
|
||||||
result.append([source, isochrone.duration, result_polygon])
|
result.append([source, isochrone.duration, result_polygon])
|
||||||
else:
|
else:
|
||||||
quota_service.increment_empty_service_use()
|
|
||||||
result.append([source, isochrone.duration, None])
|
result.append([source, isochrone.duration, None])
|
||||||
quota_service.increment_success_service_use()
|
quota_service.increment_success_service_use()
|
||||||
quota_service.increment_isolines_service_use(len(result))
|
quota_service.increment_isolines_service_use(len(result))
|
||||||
@@ -356,10 +354,8 @@ RETURNS SETOF cdb_dataservices_server.isoline AS $$
|
|||||||
for isochrone in resp:
|
for isochrone in resp:
|
||||||
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
||||||
if result_polygon:
|
if result_polygon:
|
||||||
service_manager.quota_service.increment_success_service_use()
|
|
||||||
result.append([source, isochrone.duration, result_polygon])
|
result.append([source, isochrone.duration, result_polygon])
|
||||||
else:
|
else:
|
||||||
service_manager.quota_service.increment_empty_service_use()
|
|
||||||
result.append([source, isochrone.duration, None])
|
result.append([source, isochrone.duration, None])
|
||||||
service_manager.quota_service.increment_success_service_use()
|
service_manager.quota_service.increment_success_service_use()
|
||||||
service_manager.quota_service.increment_isolines_service_use(len(result))
|
service_manager.quota_service.increment_isolines_service_use(len(result))
|
||||||
@@ -416,10 +412,8 @@ RETURNS SETOF cdb_dataservices_server.isoline AS $$
|
|||||||
for isochrone in resp:
|
for isochrone in resp:
|
||||||
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
result_polygon = coordinates_to_polygon(isochrone.coordinates)
|
||||||
if result_polygon:
|
if result_polygon:
|
||||||
service_manager.quota_service.increment_success_service_use()
|
|
||||||
result.append([source, isochrone.duration, result_polygon])
|
result.append([source, isochrone.duration, result_polygon])
|
||||||
else:
|
else:
|
||||||
service_manager.quota_service.increment_empty_service_use()
|
|
||||||
result.append([source, isochrone.duration, None])
|
result.append([source, isochrone.duration, None])
|
||||||
service_manager.quota_service.increment_success_service_use()
|
service_manager.quota_service.increment_success_service_use()
|
||||||
service_manager.quota_service.increment_isolines_service_use(len(result))
|
service_manager.quota_service.increment_isolines_service_use(len(result))
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from collections import namedtuple
|
|||||||
from requests.adapters import HTTPAdapter
|
from requests.adapters import HTTPAdapter
|
||||||
from cartodb_services import StreetPointBulkGeocoder
|
from cartodb_services import StreetPointBulkGeocoder
|
||||||
from cartodb_services.here import HereMapsGeocoder
|
from cartodb_services.here import HereMapsGeocoder
|
||||||
from cartodb_services.geocoder import geocoder_metadata, geocoder_error_response
|
from cartodb_services.geocoder import geocoder_metadata, geocoder_error_response, PRECISION_INTERPOLATED
|
||||||
from cartodb_services.metrics import Traceable
|
from cartodb_services.metrics import Traceable
|
||||||
from cartodb_services.tools.exceptions import ServiceException
|
from cartodb_services.tools.exceptions import ServiceException
|
||||||
|
|
||||||
@@ -137,8 +137,8 @@ class HereMapsBulkGeocoder(HereMapsGeocoder, StreetPointBulkGeocoder):
|
|||||||
reader = csv.DictReader(root_zip.open(name), delimiter='|')
|
reader = csv.DictReader(root_zip.open(name), delimiter='|')
|
||||||
for row in reader:
|
for row in reader:
|
||||||
if row['SeqNumber'] == '1': # First per requested data
|
if row['SeqNumber'] == '1': # First per requested data
|
||||||
precision = self.PRECISION_BY_MATCH_TYPE[
|
precision = self.PRECISION_BY_MATCH_TYPE.get(
|
||||||
row.get('matchType', 'pointAddress')]
|
row.get('matchType'), PRECISION_INTERPOLATED)
|
||||||
match_type = self.MATCH_TYPE_BY_MATCH_LEVEL.get(row['matchLevel'], None)
|
match_type = self.MATCH_TYPE_BY_MATCH_LEVEL.get(row['matchLevel'], None)
|
||||||
results.append((row['recId'],
|
results.append((row['recId'],
|
||||||
[row['displayLongitude'], row['displayLatitude']],
|
[row['displayLongitude'], row['displayLatitude']],
|
||||||
|
|||||||
@@ -143,8 +143,8 @@ class HereMapsGeocoder(Traceable):
|
|||||||
|
|
||||||
def _extract_metadata_from_result(self, result):
|
def _extract_metadata_from_result(self, result):
|
||||||
# See https://stackoverflow.com/questions/51285622/missing-matchtype-at-here-geocoding-responses
|
# See https://stackoverflow.com/questions/51285622/missing-matchtype-at-here-geocoding-responses
|
||||||
precision = self.PRECISION_BY_MATCH_TYPE[
|
precision = self.PRECISION_BY_MATCH_TYPE.get(
|
||||||
result.get('MatchType', 'pointAddress')]
|
result.get('MatchType'), PRECISION_INTERPOLATED)
|
||||||
match_type = self.MATCH_TYPE_BY_MATCH_LEVEL.get(result['MatchLevel'], None)
|
match_type = self.MATCH_TYPE_BY_MATCH_LEVEL.get(result['MatchLevel'], None)
|
||||||
return geocoder_metadata(
|
return geocoder_metadata(
|
||||||
result['Relevance'],
|
result['Relevance'],
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ class TomTomGeocoder(Traceable):
|
|||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@qps_retry(qps=5)
|
@qps_retry(qps=5, provider='tomtom')
|
||||||
def geocode(self, searchtext, city=None, state_province=None,
|
def geocode(self, searchtext, city=None, state_province=None,
|
||||||
country=None):
|
country=None):
|
||||||
response = self.geocode_meta(searchtext, city, state_province, country)
|
response = self.geocode_meta(searchtext, city, state_province, country)
|
||||||
@@ -80,7 +80,7 @@ class TomTomGeocoder(Traceable):
|
|||||||
else:
|
else:
|
||||||
return response[0]
|
return response[0]
|
||||||
|
|
||||||
@qps_retry(qps=5)
|
@qps_retry(qps=5, provider='tomtom')
|
||||||
def geocode_meta(self, searchtext, city=None, state_province=None,
|
def geocode_meta(self, searchtext, city=None, state_province=None,
|
||||||
country=None):
|
country=None):
|
||||||
if searchtext:
|
if searchtext:
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ class TomTomIsolines():
|
|||||||
|
|
||||||
return self._parse_coordinates(reachable_range[ENTRY_BOUNDARY])
|
return self._parse_coordinates(reachable_range[ENTRY_BOUNDARY])
|
||||||
|
|
||||||
@qps_retry(qps=5)
|
@qps_retry(qps=5, provider='tomtom')
|
||||||
def _calculate_isoline(self, origin, time_range,
|
def _calculate_isoline(self, origin, time_range,
|
||||||
profile=DEFAULT_PROFILE,
|
profile=DEFAULT_PROFILE,
|
||||||
date_time=DEFAULT_DEPARTAT):
|
date_time=DEFAULT_DEPARTAT):
|
||||||
|
|||||||
@@ -11,13 +11,14 @@ from cartodb_services.tools.coordinates import (validate_coordinates,
|
|||||||
marshall_coordinates)
|
marshall_coordinates)
|
||||||
from cartodb_services.tools.exceptions import ServiceException
|
from cartodb_services.tools.exceptions import ServiceException
|
||||||
from cartodb_services.tools.qps import qps_retry
|
from cartodb_services.tools.qps import qps_retry
|
||||||
from types import (DEFAULT_PROFILE, VALID_PROFILES, DEFAULT_DEPARTAT)
|
from types import (DEFAULT_PROFILE, DEFAULT_ROUTE_TYPE, VALID_PROFILES, VALID_ROUTE_TYPE, DEFAULT_DEPARTAT)
|
||||||
|
|
||||||
BASEURI = ('https://api.tomtom.com/routing/1/calculateRoute/'
|
BASEURI = ('https://api.tomtom.com/routing/1/calculateRoute/'
|
||||||
'{coordinates}'
|
'{coordinates}'
|
||||||
'/json'
|
'/json'
|
||||||
'?key={apikey}'
|
'?key={apikey}'
|
||||||
'&travelMode={travelmode}'
|
'&travelMode={travelmode}'
|
||||||
|
'&routeType={route_type}'
|
||||||
'&departAt={departat}'
|
'&departAt={departat}'
|
||||||
'&computeBestOrder=true')
|
'&computeBestOrder=true')
|
||||||
|
|
||||||
@@ -45,10 +46,11 @@ class TomTomRouting(Traceable):
|
|||||||
self._logger = logger
|
self._logger = logger
|
||||||
|
|
||||||
def _uri(self, coordinates, profile=DEFAULT_PROFILE,
|
def _uri(self, coordinates, profile=DEFAULT_PROFILE,
|
||||||
date_time=DEFAULT_DEPARTAT):
|
date_time=DEFAULT_DEPARTAT, route_type=DEFAULT_ROUTE_TYPE):
|
||||||
uri = URITemplate(BASEURI).expand(apikey=self._apikey,
|
uri = URITemplate(BASEURI).expand(apikey=self._apikey,
|
||||||
coordinates=coordinates,
|
coordinates=coordinates,
|
||||||
travelmode=profile,
|
travelmode=profile,
|
||||||
|
route_type=route_type,
|
||||||
departat=date_time)
|
departat=date_time)
|
||||||
return uri
|
return uri
|
||||||
|
|
||||||
@@ -60,6 +62,14 @@ class TomTomRouting(Traceable):
|
|||||||
valid_profiles=', '.join(
|
valid_profiles=', '.join(
|
||||||
[x for x in VALID_PROFILES])))
|
[x for x in VALID_PROFILES])))
|
||||||
|
|
||||||
|
def _validate_route_type(self, route_type):
|
||||||
|
if route_type not in VALID_ROUTE_TYPE:
|
||||||
|
raise ValueError('{route_type} is not a valid route type. '
|
||||||
|
'Valid route types are: {valid_route_types}'.format(
|
||||||
|
route_type=route_type,
|
||||||
|
valid_route_types=', '.join(
|
||||||
|
[x for x in VALID_ROUTE_TYPE])))
|
||||||
|
|
||||||
def _marshall_coordinates(self, coordinates):
|
def _marshall_coordinates(self, coordinates):
|
||||||
return ':'.join(['{lat},{lon}'.format(lat=coordinate.latitude,
|
return ':'.join(['{lat},{lon}'.format(lat=coordinate.latitude,
|
||||||
lon=coordinate.longitude)
|
lon=coordinate.longitude)
|
||||||
@@ -89,15 +99,16 @@ class TomTomRouting(Traceable):
|
|||||||
point[ENTRY_LONGITUDE]))
|
point[ENTRY_LONGITUDE]))
|
||||||
return geometry
|
return geometry
|
||||||
|
|
||||||
@qps_retry(qps=5)
|
@qps_retry(qps=5, provider='tomtom')
|
||||||
def directions(self, waypoints, profile=DEFAULT_PROFILE,
|
def directions(self, waypoints, profile=DEFAULT_PROFILE,
|
||||||
date_time=DEFAULT_DEPARTAT):
|
date_time=DEFAULT_DEPARTAT, route_type=DEFAULT_ROUTE_TYPE):
|
||||||
self._validate_profile(profile)
|
self._validate_profile(profile)
|
||||||
|
self._validate_route_type(route_type)
|
||||||
validate_coordinates(waypoints, NUM_WAYPOINTS_MIN, NUM_WAYPOINTS_MAX)
|
validate_coordinates(waypoints, NUM_WAYPOINTS_MIN, NUM_WAYPOINTS_MAX)
|
||||||
|
|
||||||
coordinates = self._marshall_coordinates(waypoints)
|
coordinates = self._marshall_coordinates(waypoints)
|
||||||
|
|
||||||
uri = self._uri(coordinates, profile, date_time)
|
uri = self._uri(coordinates, profile, date_time, route_type)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = requests.get(uri)
|
response = requests.get(uri)
|
||||||
|
|||||||
@@ -6,12 +6,16 @@ PROFILE_DRIVING = 'car'
|
|||||||
PROFILE_CYCLING = 'bicycle'
|
PROFILE_CYCLING = 'bicycle'
|
||||||
PROFILE_WALKING = 'pedestrian'
|
PROFILE_WALKING = 'pedestrian'
|
||||||
DEFAULT_PROFILE = PROFILE_DRIVING
|
DEFAULT_PROFILE = PROFILE_DRIVING
|
||||||
|
ROUTE_TYPE_FAST = 'fastest'
|
||||||
|
ROUTE_TYPE_SHORT = 'shortest'
|
||||||
|
|
||||||
DEFAULT_DEPARTAT = 'now'
|
DEFAULT_DEPARTAT = 'now'
|
||||||
|
|
||||||
VALID_PROFILES = [PROFILE_DRIVING,
|
VALID_PROFILES = [PROFILE_DRIVING,
|
||||||
PROFILE_CYCLING,
|
PROFILE_CYCLING,
|
||||||
PROFILE_WALKING]
|
PROFILE_WALKING]
|
||||||
|
VALID_ROUTE_TYPE = [ROUTE_TYPE_SHORT,
|
||||||
|
ROUTE_TYPE_FAST]
|
||||||
|
|
||||||
MAX_SPEEDS = {
|
MAX_SPEEDS = {
|
||||||
PROFILE_WALKING: 3.3333333, # In m/s, assuming 12km/h walking speed
|
PROFILE_WALKING: 3.3333333, # In m/s, assuming 12km/h walking speed
|
||||||
@@ -20,7 +24,13 @@ MAX_SPEEDS = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TRANSPORT_MODE_TO_TOMTOM = {
|
TRANSPORT_MODE_TO_TOMTOM = {
|
||||||
'car': 'car',
|
'car': PROFILE_DRIVING,
|
||||||
'walk': 'pedestrian',
|
'walk': PROFILE_WALKING,
|
||||||
'bicycle': 'bicycle',
|
'bicycle': PROFILE_CYCLING,
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFAULT_ROUTE_TYPE = ROUTE_TYPE_SHORT
|
||||||
|
MODE_TYPE_TO_TOMTOM = {
|
||||||
|
'shortest': ROUTE_TYPE_SHORT,
|
||||||
|
'fastest': ROUTE_TYPE_FAST
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
def normalize(str_input):
|
def normalize(str_input):
|
||||||
return str_input.replace('"', '"') \
|
return str_input.replace('"', '"') \
|
||||||
.replace(';', ',')
|
.replace(';', ',')
|
||||||
|
|
||||||
|
def options_to_dict(options):
|
||||||
|
return dict(option.split("=") for option in options)
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ from exceptions import TimeoutException
|
|||||||
DEFAULT_RETRY_TIMEOUT = 60
|
DEFAULT_RETRY_TIMEOUT = 60
|
||||||
DEFAULT_QUERIES_PER_SECOND = 10
|
DEFAULT_QUERIES_PER_SECOND = 10
|
||||||
|
|
||||||
|
TOMTOM_403_RATE_LIMIT_HEADER = 'Account Over Queries Per Second Limit'
|
||||||
|
TOMTOM_DETAIL_HEADER = 'X-Error-Detail-Header'
|
||||||
|
|
||||||
|
|
||||||
def qps_retry(original_function=None, **options):
|
def qps_retry(original_function=None, **options):
|
||||||
""" Query Per Second retry decorator
|
""" Query Per Second retry decorator
|
||||||
@@ -18,15 +21,10 @@ def qps_retry(original_function=None, **options):
|
|||||||
"""
|
"""
|
||||||
if original_function is not None:
|
if original_function is not None:
|
||||||
def wrapped_function(*args, **kwargs):
|
def wrapped_function(*args, **kwargs):
|
||||||
if 'timeout' in options:
|
timeout = options.get('timeout', DEFAULT_RETRY_TIMEOUT)
|
||||||
timeout = options['timeout']
|
qps = options.get('qps', DEFAULT_QUERIES_PER_SECOND)
|
||||||
else:
|
provider = options.get('provider', None)
|
||||||
timeout = DEFAULT_RETRY_TIMEOUT
|
return QPSService(retry_timeout=timeout, queries_per_second=qps, provider=provider).call(original_function, *args, **kwargs)
|
||||||
if 'qps' in options:
|
|
||||||
qps = options['qps']
|
|
||||||
else:
|
|
||||||
qps = DEFAULT_QUERIES_PER_SECOND
|
|
||||||
return QPSService(retry_timeout=timeout, queries_per_second=qps).call(original_function, *args, **kwargs)
|
|
||||||
return wrapped_function
|
return wrapped_function
|
||||||
else:
|
else:
|
||||||
def partial_wrapper(func):
|
def partial_wrapper(func):
|
||||||
@@ -36,9 +34,10 @@ def qps_retry(original_function=None, **options):
|
|||||||
|
|
||||||
class QPSService:
|
class QPSService:
|
||||||
|
|
||||||
def __init__(self, queries_per_second, retry_timeout):
|
def __init__(self, queries_per_second, retry_timeout, provider):
|
||||||
self._queries_per_second = queries_per_second
|
self._queries_per_second = queries_per_second
|
||||||
self._retry_timeout = retry_timeout
|
self._retry_timeout = retry_timeout
|
||||||
|
self._provider = provider
|
||||||
|
|
||||||
def call(self, fn, *args, **kwargs):
|
def call(self, fn, *args, **kwargs):
|
||||||
start_time = datetime.now()
|
start_time = datetime.now()
|
||||||
@@ -48,8 +47,15 @@ class QPSService:
|
|||||||
return fn(*args, **kwargs)
|
return fn(*args, **kwargs)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
response = getattr(e, 'response', None)
|
response = getattr(e, 'response', None)
|
||||||
if response is not None and (response.status_code == 429):
|
if response is not None:
|
||||||
self.retry(start_time, attempt_number)
|
if self._provider is not None and self._provider == 'tomtom' and (response.status_code == 403):
|
||||||
|
if response.headers.get(TOMTOM_DETAIL_HEADER) != TOMTOM_403_RATE_LIMIT_HEADER:
|
||||||
|
raise e
|
||||||
|
self.retry(start_time, attempt_number)
|
||||||
|
elif response.status_code == 429:
|
||||||
|
self.retry(start_time, attempt_number)
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
else:
|
else:
|
||||||
raise e
|
raise e
|
||||||
attempt_number += 1
|
attempt_number += 1
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ from setuptools import setup, find_packages
|
|||||||
setup(
|
setup(
|
||||||
name='cartodb_services',
|
name='cartodb_services',
|
||||||
|
|
||||||
version='0.20.0',
|
version='0.21.1',
|
||||||
|
|
||||||
description='CartoDB Services API Python Library',
|
description='CartoDB Services API Python Library',
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,9 @@ INVALID_WAYPOINTS_MIN = [Coordinate(13.42936, 52.50931)]
|
|||||||
INVALID_WAYPOINTS_MAX = [Coordinate(13.42936, 52.50931)
|
INVALID_WAYPOINTS_MAX = [Coordinate(13.42936, 52.50931)
|
||||||
for x in range(0, NUM_WAYPOINTS_MAX + 2)]
|
for x in range(0, NUM_WAYPOINTS_MAX + 2)]
|
||||||
VALID_PROFILE = DEFAULT_PROFILE
|
VALID_PROFILE = DEFAULT_PROFILE
|
||||||
|
VALID_ROUTE_TYPE = 'fastest'
|
||||||
INVALID_PROFILE = 'invalid_profile'
|
INVALID_PROFILE = 'invalid_profile'
|
||||||
|
INVALID_ROUTE_TYPE = 'invalid_route_type'
|
||||||
|
|
||||||
|
|
||||||
class TomTomRoutingTestCase(unittest.TestCase):
|
class TomTomRoutingTestCase(unittest.TestCase):
|
||||||
@@ -43,6 +45,9 @@ class TomTomRoutingTestCase(unittest.TestCase):
|
|||||||
with self.assertRaises(ServiceException):
|
with self.assertRaises(ServiceException):
|
||||||
invalid_routing.directions(VALID_WAYPOINTS,
|
invalid_routing.directions(VALID_WAYPOINTS,
|
||||||
VALID_PROFILE)
|
VALID_PROFILE)
|
||||||
|
def test_invalid_route_type(self):
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
self.routing.directions(VALID_WAYPOINTS, VALID_PROFILE, route_type=INVALID_ROUTE_TYPE)
|
||||||
|
|
||||||
def test_valid_request(self):
|
def test_valid_request(self):
|
||||||
route = self.routing.directions(VALID_WAYPOINTS, VALID_PROFILE)
|
route = self.routing.directions(VALID_WAYPOINTS, VALID_PROFILE)
|
||||||
@@ -50,3 +55,9 @@ class TomTomRoutingTestCase(unittest.TestCase):
|
|||||||
assert route.shape
|
assert route.shape
|
||||||
assert route.length
|
assert route.length
|
||||||
assert route.duration
|
assert route.duration
|
||||||
|
|
||||||
|
route = self.routing.directions(VALID_WAYPOINTS, VALID_PROFILE, route_type=VALID_ROUTE_TYPE)
|
||||||
|
|
||||||
|
assert route.shape
|
||||||
|
assert route.length
|
||||||
|
assert route.duration
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from nose.tools import assert_raises
|
from nose.tools import assert_raises
|
||||||
from nose.tools import assert_not_equal, assert_equal
|
from nose.tools import assert_not_equal, assert_in
|
||||||
from ..helpers.integration_test_helper import IntegrationTestHelper
|
from ..helpers.integration_test_helper import IntegrationTestHelper
|
||||||
|
|
||||||
|
|
||||||
@@ -12,7 +12,6 @@ class TestAdmin0Functions(TestCase):
|
|||||||
self.env_variables['schema'],
|
self.env_variables['schema'],
|
||||||
self.env_variables['username'],
|
self.env_variables['username'],
|
||||||
self.env_variables['host'],
|
self.env_variables['host'],
|
||||||
self.env_variables['api_key']
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_if_select_with_admin0_is_ok(self):
|
def test_if_select_with_admin0_is_ok(self):
|
||||||
@@ -29,4 +28,4 @@ class TestAdmin0Functions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Geocoding permission denied", "function cdb_geocode_admin0_polygon(text) does not exist"])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from nose.tools import assert_raises
|
from nose.tools import assert_raises
|
||||||
from nose.tools import assert_not_equal, assert_equal
|
from nose.tools import assert_not_equal, assert_in
|
||||||
from ..helpers.integration_test_helper import IntegrationTestHelper
|
from ..helpers.integration_test_helper import IntegrationTestHelper
|
||||||
|
|
||||||
|
|
||||||
@@ -12,30 +12,29 @@ class TestAdmin1Functions(TestCase):
|
|||||||
self.env_variables['schema'],
|
self.env_variables['schema'],
|
||||||
self.env_variables['username'],
|
self.env_variables['username'],
|
||||||
self.env_variables['host'],
|
self.env_variables['host'],
|
||||||
self.env_variables['api_key']
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_if_select_with_admin1_without_country_is_ok(self):
|
def test_if_select_with_admin1_without_country_is_ok(self):
|
||||||
query = "SELECT cdb_geocode_admin1_polygon(province) as geometry " \
|
query = "SELECT cdb_geocode_admin1_polygon(province) as geometry " \
|
||||||
"FROM {0} LIMIT 1&api_key={1}".format(
|
"FROM {0} LIMIT 1&api_key={1}".format(
|
||||||
self.env_variables['table_name'],
|
self.env_variables['table_name'],
|
||||||
self.env_variables['api_key'])
|
self.env_variables['api_key'])
|
||||||
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
assert_not_equal(geometry['geometry'], None)
|
assert_not_equal(geometry['geometry'], None)
|
||||||
|
|
||||||
def test_if_select_with_admin1_with_country_is_ok(self):
|
def test_if_select_with_admin1_with_country_is_ok(self):
|
||||||
query = "SELECT cdb_geocode_admin1_polygon(province,country)" \
|
query = "SELECT cdb_geocode_admin1_polygon(province,country)" \
|
||||||
"as geometry FROM {0} LIMIT 1&api_key={1}".format(
|
"as geometry FROM {0} LIMIT 1&api_key={1}".format(
|
||||||
self.env_variables['table_name'],
|
self.env_variables['table_name'],
|
||||||
self.env_variables['api_key'])
|
self.env_variables['api_key'])
|
||||||
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
assert_not_equal(geometry['geometry'], None)
|
assert_not_equal(geometry['geometry'], None)
|
||||||
|
|
||||||
def test_if_select_with_admin1_without_api_key_raise_error(self):
|
def test_if_select_with_admin1_without_api_key_raise_error(self):
|
||||||
query = "SELECT cdb_geocode_admin1_polygon(province) as geometry " \
|
query = "SELECT cdb_geocode_admin1_polygon(province) as geometry " \
|
||||||
"FROM {0} LIMIT 1".format(
|
"FROM {0} LIMIT 1".format(
|
||||||
self.env_variables['table_name'])
|
self.env_variables['table_name'])
|
||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Geocoding permission denied", "function cdb_geocode_admin1_polygon(text) does not exist"])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from nose.tools import assert_raises
|
from nose.tools import assert_raises
|
||||||
from nose.tools import assert_not_equal, assert_equal
|
from nose.tools import assert_not_equal, assert_in
|
||||||
from ..helpers.integration_test_helper import IntegrationTestHelper
|
from ..helpers.integration_test_helper import IntegrationTestHelper
|
||||||
|
|
||||||
|
|
||||||
@@ -12,7 +12,6 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
self.env_variables['schema'],
|
self.env_variables['schema'],
|
||||||
self.env_variables['username'],
|
self.env_variables['username'],
|
||||||
self.env_variables['host'],
|
self.env_variables['host'],
|
||||||
self.env_variables['api_key']
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_if_get_demographic_snapshot_is_ok(self):
|
def test_if_get_demographic_snapshot_is_ok(self):
|
||||||
@@ -25,7 +24,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getdemographicsnapshot(geometry) does not exist"])
|
||||||
|
|
||||||
def test_if_get_segment_snapshot_is_ok(self):
|
def test_if_get_segment_snapshot_is_ok(self):
|
||||||
query = "SELECT OBS_GetSegmentSnapshot(CDB_LatLng(40.704512, -73.936669)) as snapshot;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT OBS_GetSegmentSnapshot(CDB_LatLng(40.704512, -73.936669)) as snapshot;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -37,7 +36,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getsegmentsnapshot(geometry) does not exist"])
|
||||||
|
|
||||||
def test_if_get_measure_with_point_is_ok(self):
|
def test_if_get_measure_with_point_is_ok(self):
|
||||||
query = "SELECT OBS_GetMeasure(CDB_LatLng(40.704512, -73.936669), 'us.census.acs.B01003001') as measure;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT OBS_GetMeasure(CDB_LatLng(40.704512, -73.936669), 'us.census.acs.B01003001') as measure;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -54,7 +53,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getmeasure(geometry, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_get_measure_by_id_ok(self):
|
def test_if_get_measure_by_id_ok(self):
|
||||||
query = "SELECT OBS_GetMeasureById('36047048500', 'us.census.acs.B01003001', 'us.census.tiger.census_tract', '2010 - 2014') as measure;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT OBS_GetMeasureById('36047048500', 'us.census.acs.B01003001', 'us.census.tiger.census_tract', '2010 - 2014') as measure;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -66,7 +65,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getmeasurebyid(unknown, unknown, unknown, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_get_category_is_ok(self):
|
def test_if_get_category_is_ok(self):
|
||||||
query = "SELECT OBS_GetCategory(CDB_LatLng(40.704512, -73.936669), 'us.census.spielman_singleton_segments.X10', 'us.census.tiger.census_tract', '2010 - 2014') as category;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT OBS_GetCategory(CDB_LatLng(40.704512, -73.936669), 'us.census.spielman_singleton_segments.X10', 'us.census.tiger.census_tract', '2010 - 2014') as category;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -78,7 +77,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getcategory(geometry, unknown, unknown, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_get_us_census_measure_with_point_is_ok(self):
|
def test_if_get_us_census_measure_with_point_is_ok(self):
|
||||||
query = "SELECT OBS_GetUSCensusMeasure(CDB_LatLng(40.704512, -73.936669), 'male population') as measure;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT OBS_GetUSCensusMeasure(CDB_LatLng(40.704512, -73.936669), 'male population') as measure;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -95,7 +94,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getuscensusmeasure(geometry, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_get_us_census_category_is_ok(self):
|
def test_if_get_us_census_category_is_ok(self):
|
||||||
query = "SELECT OBS_GetUSCensusCategory('0103000020E61000000100000021000000BB366F6D917B52C0E7BB6EA82B5A444067224C85937B52C0810205E70E5A4440596D6342997B52C09BED2952F35944400A96386CA27B52C07B6D31F9D95944402B81A0A8AE7B52C0D16B73D5C3594440C34C397FBD7B52C0D8B5B7C0B1594440CFD90A5ECE7B52C0BE8DD86CA45944405C7E229FE07B52C0A904EE5C9C59444017C1F28EF37B52C05E2745E099594440AE8A3873067C52C0FD62540F9D5944402F272292187C52C05502CBCAA5594440C3F17139297C52C0B3FBC4BCB3594440DDAE56C5377C52C00C46175CC6594440E96AB6A6437C52C0355C94F1DC5944402313AE684C7C52C05340159FF6594440B3B90FB5517C52C031F30168125A44407F43B357537C52C0DF95053B2F5A444059C17840517C52C0D9E08EFC4B5A44406580E8834B7C52C046B5B591675A444035736A5A427C52C0AF9A1AEB805A44402E721C1E367C52C0D226550F975A4440506D5C47277C52C0A2968A24A95A4440507C2868167C52C0D51FCE78B65A4440C4438226047C52C02369F888BE5A4440C9F10C36F17B52C027B1B205C15A4440AABE2451DE7B52C0F5E383D6BD5A44402A18B431CC7B52C01785C11AB55A444018320D8ABB7B52C070265B28A75A4440E28A0EFEAC7B52C09E518C88945A44401D08D61CA17B52C09E8195F27D5A4440D7C3405B987B52C0643CB044645A444047B16D0F937B52C04EC9837B485A4440BB366F6D917B52C0E7BB6EA82B5A4440'::geometry, 'Spielman-Singleton Segments: 10 Clusters') as category;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT OBS_GetUSCensusCategory('0103000020E61000000100000021000000BB366F6D917B52C0E7BB6EA82B5A444067224C85937B52C0810205E70E5A4440596D6342997B52C09BED2952F35944400A96386CA27B52C07B6D31F9D95944402B81A0A8AE7B52C0D16B73D5C3594440C34C397FBD7B52C0D8B5B7C0B1594440CFD90A5ECE7B52C0BE8DD86CA45944405C7E229FE07B52C0A904EE5C9C59444017C1F28EF37B52C05E2745E099594440AE8A3873067C52C0FD62540F9D5944402F272292187C52C05502CBCAA5594440C3F17139297C52C0B3FBC4BCB3594440DDAE56C5377C52C00C46175CC6594440E96AB6A6437C52C0355C94F1DC5944402313AE684C7C52C05340159FF6594440B3B90FB5517C52C031F30168125A44407F43B357537C52C0DF95053B2F5A444059C17840517C52C0D9E08EFC4B5A44406580E8834B7C52C046B5B591675A444035736A5A427C52C0AF9A1AEB805A44402E721C1E367C52C0D226550F975A4440506D5C47277C52C0A2968A24A95A4440507C2868167C52C0D51FCE78B65A4440C4438226047C52C02369F888BE5A4440C9F10C36F17B52C027B1B205C15A4440AABE2451DE7B52C0F5E383D6BD5A44402A18B431CC7B52C01785C11AB55A444018320D8ABB7B52C070265B28A75A4440E28A0EFEAC7B52C09E518C88945A44401D08D61CA17B52C09E8195F27D5A4440D7C3405B987B52C0643CB044645A444047B16D0F937B52C04EC9837B485A4440BB366F6D917B52C0E7BB6EA82B5A4440'::geometry, 'Spielman-Singleton Segments: 10 Clusters') as category;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -107,7 +106,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getuscensuscategory(geometry, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_get_population_is_ok(self):
|
def test_if_get_population_is_ok(self):
|
||||||
query = "SELECT OBS_GetPopulation(CDB_LatLng(40.704512, -73.936669)) as population;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT OBS_GetPopulation(CDB_LatLng(40.704512, -73.936669)) as population;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -119,7 +118,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getpopulation(geometry) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_search_is_ok(self):
|
def test_if_obs_search_is_ok(self):
|
||||||
sql = "SELECT id FROM OBS_Search('total_pop') WHERE id LIKE 'es.ine%' LIMIT 1;"
|
sql = "SELECT id FROM OBS_Search('total_pop') WHERE id LIKE 'es.ine%' LIMIT 1;"
|
||||||
@@ -133,7 +132,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_search(unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_available_boundaries_is_ok(self):
|
def test_if_obs_get_available_boundaries_is_ok(self):
|
||||||
query = "SELECT boundary_id FROM OBS_GetAvailableBoundaries(CDB_LatLng(40.704512, -73.936669)) LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT boundary_id FROM OBS_GetAvailableBoundaries(CDB_LatLng(40.704512, -73.936669)) LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -145,7 +144,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getavailableboundaries(geometry) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_boundary_is_ok(self):
|
def test_if_obs_get_boundary_is_ok(self):
|
||||||
query = "SELECT OBS_GetBoundary(CDB_LatLng(40.704512, -73.936669), 'us.census.tiger.census_tract') as boundary;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT OBS_GetBoundary(CDB_LatLng(40.704512, -73.936669), 'us.census.tiger.census_tract') as boundary;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -157,7 +156,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getboundary(geometry, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_boundary_id_is_ok(self):
|
def test_if_obs_get_boundary_id_is_ok(self):
|
||||||
query = "SELECT OBS_GetBoundaryId(CDB_LatLng(40.704512, -73.936669), 'us.census.tiger.census_tract', '2015') as boundary_id;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT OBS_GetBoundaryId(CDB_LatLng(40.704512, -73.936669), 'us.census.tiger.census_tract', '2015') as boundary_id;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -169,7 +168,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getboundaryid(geometry, unknown, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_boundary_by_id_is_ok(self):
|
def test_if_obs_get_boundary_by_id_is_ok(self):
|
||||||
query = "SELECT OBS_GetBoundaryById('36047', 'us.census.tiger.county', '2014') as boundary;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT OBS_GetBoundaryById('36047', 'us.census.tiger.county', '2014') as boundary;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -181,7 +180,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getboundarybyid(unknown, unknown, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_boundaries_by_geometry_is_ok(self):
|
def test_if_obs_get_boundaries_by_geometry_is_ok(self):
|
||||||
query = "SELECT geom_refs FROM OBS_GetBoundariesByGeometry(ST_MakeEnvelope(-73.9452409744,40.6988851644,-73.9280319214,40.7101254524,4326), 'us.census.tiger.census_tract') ORDER BY geom_refs ASC LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT geom_refs FROM OBS_GetBoundariesByGeometry(ST_MakeEnvelope(-73.9452409744,40.6988851644,-73.9280319214,40.7101254524,4326), 'us.census.tiger.census_tract') ORDER BY geom_refs ASC LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -193,7 +192,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getboundariesbygeometry(geometry, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_boundaries_by_point_and_radius_is_ok(self):
|
def test_if_obs_get_boundaries_by_point_and_radius_is_ok(self):
|
||||||
query = "SELECT geom_refs FROM OBS_GetBoundariesByPointAndRadius(CDB_LatLng(40.704512, -73.936669), 500, 'us.census.tiger.census_tract') ORDER BY geom_refs ASC LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT geom_refs FROM OBS_GetBoundariesByPointAndRadius(CDB_LatLng(40.704512, -73.936669), 500, 'us.census.tiger.census_tract') ORDER BY geom_refs ASC LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -205,7 +204,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getboundariesbypointandradius(geometry, integer, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_points_by_geometry_is_ok(self):
|
def test_if_obs_get_points_by_geometry_is_ok(self):
|
||||||
query = "SELECT geom_refs FROM OBS_GetPointsByGeometry(ST_MakeEnvelope(-73.9452409744,40.6988851644,-73.9280319214,40.7101254524,4326), 'us.census.tiger.census_tract') ORDER BY geom_refs ASC LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT geom_refs FROM OBS_GetPointsByGeometry(ST_MakeEnvelope(-73.9452409744,40.6988851644,-73.9280319214,40.7101254524,4326), 'us.census.tiger.census_tract') ORDER BY geom_refs ASC LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -217,7 +216,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getpointsbygeometry(geometry, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_points_by_point_and_radius_is_ok(self):
|
def test_if_obs_get_points_by_point_and_radius_is_ok(self):
|
||||||
query = "SELECT geom_refs FROM OBS_GetPointsByPointAndRadius(CDB_LatLng(40.704512, -73.936669), 500, 'us.census.tiger.census_tract', '2014') ORDER BY geom_refs ASC LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT geom_refs FROM OBS_GetPointsByPointAndRadius(CDB_LatLng(40.704512, -73.936669), 500, 'us.census.tiger.census_tract', '2014') ORDER BY geom_refs ASC LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -229,19 +228,19 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getpointsbypointandradius(geometry, integer, unknown, unknown) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_legacy_builder_metadata_is_ok(self):
|
def test_if_obs_get_legacy_builder_metadata_is_ok(self):
|
||||||
query = "SELECT name FROM OBS_LegacyBuilderMetadata() LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT name FROM OBS_LegacyBuilderMetadata() LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
result = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
result = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
assert_not_equal(result['name'], None)
|
assert_not_equal(result['name'], None)
|
||||||
|
|
||||||
def test_if_obs_get_points_by_point_and_radius_without_api_key_raise_error(self):
|
def test_if_legacy_builder_metadata_without_api_key_raise_error(self):
|
||||||
query = "SELECT name FROM OBS_LegacyBuilderMetadata() LIMIT 1;"
|
query = "SELECT name FROM OBS_LegacyBuilderMetadata() LIMIT 1;"
|
||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_legacybuildermetadata() does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_available_numerators_is_ok(self):
|
def test_if_obs_get_available_numerators_is_ok(self):
|
||||||
query = "SELECT numer_id FROM OBS_GetAvailableNumerators() LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT numer_id FROM OBS_GetAvailableNumerators() LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -253,7 +252,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getavailablenumerators() does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_available_denominators_is_ok(self):
|
def test_if_obs_get_available_denominators_is_ok(self):
|
||||||
query = "SELECT denom_id FROM OBS_GetAvailableDenominators() LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT denom_id FROM OBS_GetAvailableDenominators() LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -265,7 +264,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getavailabledenominators() does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_available_geometries_is_ok(self):
|
def test_if_obs_get_available_geometries_is_ok(self):
|
||||||
query = "SELECT geom_id FROM OBS_GetAvailableGeometries() LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT geom_id FROM OBS_GetAvailableGeometries() LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -277,7 +276,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getavailablegeometries() does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_available_timespans_is_ok(self):
|
def test_if_obs_get_available_timespans_is_ok(self):
|
||||||
query = "SELECT timespan_id FROM OBS_GetAvailableTimespans() LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
query = "SELECT timespan_id FROM OBS_GetAvailableTimespans() LIMIT 1;&api_key={0}".format(self.env_variables['api_key'])
|
||||||
@@ -289,7 +288,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getavailabletimespans() does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_meta_is_ok(self):
|
def test_if_obs_get_meta_is_ok(self):
|
||||||
params = '\'[{\"numer_id\": \"us.census.acs.B01003001\"}]\''
|
params = '\'[{\"numer_id\": \"us.census.acs.B01003001\"}]\''
|
||||||
@@ -303,7 +302,7 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getmeta(geometry, unknown, integer, integer, integer) does not exist"])
|
||||||
|
|
||||||
def test_if_obs_get_data_is_ok(self):
|
def test_if_obs_get_data_is_ok(self):
|
||||||
params_1 = '\'[{\"numer_id\": \"us.census.acs.B01003001\", \"geom_id\": \"us.census.tiger.county\"}]\''
|
params_1 = '\'[{\"numer_id\": \"us.census.acs.B01003001\", \"geom_id\": \"us.census.tiger.county\"}]\''
|
||||||
@@ -323,8 +322,8 @@ class TestDataObservatoryFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query_1)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query_1)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getmeta(geometry, unknown, integer, integer, integer) does not exist"])
|
||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query_2)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query_2)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Data Observatory permission denied", "function obs_getmeta(geometry, unknown) does not exist"])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from nose.tools import assert_raises
|
from nose.tools import assert_raises
|
||||||
from nose.tools import assert_not_equal, assert_equal
|
from nose.tools import assert_not_equal, assert_in
|
||||||
from ..helpers.integration_test_helper import IntegrationTestHelper
|
from ..helpers.integration_test_helper import IntegrationTestHelper
|
||||||
|
|
||||||
|
|
||||||
@@ -12,22 +12,21 @@ class TestPostalcodeFunctions(TestCase):
|
|||||||
self.env_variables['schema'],
|
self.env_variables['schema'],
|
||||||
self.env_variables['username'],
|
self.env_variables['username'],
|
||||||
self.env_variables['host'],
|
self.env_variables['host'],
|
||||||
self.env_variables['api_key']
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_if_select_with_ipaddress_point_is_ok(self):
|
def test_if_select_with_ipaddress_point_is_ok(self):
|
||||||
query = "SELECT cdb_geocode_ipaddress_point(ip) " \
|
query = "SELECT cdb_geocode_ipaddress_point(ip) " \
|
||||||
"as geometry FROM {0} LIMIT 1&api_key={1}".format(
|
"as geometry FROM {0} LIMIT 1&api_key={1}".format(
|
||||||
self.env_variables['table_name'],
|
self.env_variables['table_name'],
|
||||||
self.env_variables['api_key'])
|
self.env_variables['api_key'])
|
||||||
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
assert_not_equal(geometry['geometry'], None)
|
assert_not_equal(geometry['geometry'], None)
|
||||||
|
|
||||||
def test_if_select_with_ipaddress_without_api_key_raise_error(self):
|
def test_if_select_with_ipaddress_without_api_key_raise_error(self):
|
||||||
query = "SELECT cdb_geocode_ipaddress_point(ip) " \
|
query = "SELECT cdb_geocode_ipaddress_point(ip) " \
|
||||||
"as geometry FROM {0} LIMIT 1".format(
|
"as geometry FROM {0} LIMIT 1".format(
|
||||||
self.env_variables['table_name'])
|
self.env_variables['table_name'])
|
||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Geocoding permission denied", "function cdb_geocode_ipaddress_point(text) does not exist"])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from nose.tools import assert_raises
|
from nose.tools import assert_raises
|
||||||
from nose.tools import assert_not_equal, assert_equal
|
from nose.tools import assert_not_equal, assert_in
|
||||||
from ..helpers.integration_test_helper import IntegrationTestHelper
|
from ..helpers.integration_test_helper import IntegrationTestHelper
|
||||||
|
|
||||||
|
|
||||||
@@ -12,7 +12,6 @@ class TestIsolinesFunctions(TestCase):
|
|||||||
self.env_variables['schema'],
|
self.env_variables['schema'],
|
||||||
self.env_variables['username'],
|
self.env_variables['username'],
|
||||||
self.env_variables['host'],
|
self.env_variables['host'],
|
||||||
self.env_variables['api_key']
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_if_select_with_isochrones_is_ok(self):
|
def test_if_select_with_isochrones_is_ok(self):
|
||||||
@@ -28,7 +27,7 @@ class TestIsolinesFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Isolines permission denied", "function cdb_isochrone(geometry, unknown, integer[]) does not exist"])
|
||||||
|
|
||||||
def test_if_select_with_isodistance_is_ok(self):
|
def test_if_select_with_isodistance_is_ok(self):
|
||||||
query = "SELECT * FROM cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, " \
|
query = "SELECT * FROM cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, " \
|
||||||
@@ -43,4 +42,4 @@ class TestIsolinesFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Isolines permission denied", "function cdb_isodistance(geometry, unknown, integer[]) does not exist"])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from nose.tools import assert_raises
|
from nose.tools import assert_raises
|
||||||
from nose.tools import assert_not_equal, assert_equal
|
from nose.tools import assert_not_equal, assert_in
|
||||||
from ..helpers.integration_test_helper import IntegrationTestHelper
|
from ..helpers.integration_test_helper import IntegrationTestHelper
|
||||||
|
|
||||||
|
|
||||||
@@ -12,38 +12,37 @@ class TestNameplaceFunctions(TestCase):
|
|||||||
self.env_variables['schema'],
|
self.env_variables['schema'],
|
||||||
self.env_variables['username'],
|
self.env_variables['username'],
|
||||||
self.env_variables['host'],
|
self.env_variables['host'],
|
||||||
self.env_variables['api_key']
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_if_select_with_namedplace_city_is_ok(self):
|
def test_if_select_with_namedplace_city_is_ok(self):
|
||||||
query = "SELECT cdb_geocode_namedplace_point(city) as geometry " \
|
query = "SELECT cdb_geocode_namedplace_point(city) as geometry " \
|
||||||
"FROM {0} LIMIT 1&api_key={1}".format(
|
"FROM {0} LIMIT 1&api_key={1}".format(
|
||||||
self.env_variables['table_name'],
|
self.env_variables['table_name'],
|
||||||
self.env_variables['api_key'])
|
self.env_variables['api_key'])
|
||||||
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
assert_not_equal(geometry['geometry'], None)
|
assert_not_equal(geometry['geometry'], None)
|
||||||
|
|
||||||
def test_if_select_with_namedplace_city_country_is_ok(self):
|
def test_if_select_with_namedplace_city_country_is_ok(self):
|
||||||
query = "SELECT cdb_geocode_namedplace_point(city,country) " \
|
query = "SELECT cdb_geocode_namedplace_point(city,country) " \
|
||||||
"as geometry FROM {0} LIMIT 1&api_key={1}".format(
|
"as geometry FROM {0} LIMIT 1&api_key={1}".format(
|
||||||
self.env_variables['table_name'],
|
self.env_variables['table_name'],
|
||||||
self.env_variables['api_key'])
|
self.env_variables['api_key'])
|
||||||
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
assert_not_equal(geometry['geometry'], None)
|
assert_not_equal(geometry['geometry'], None)
|
||||||
|
|
||||||
def test_if_select_with_namedplace_city_province_country_is_ok(self):
|
def test_if_select_with_namedplace_city_province_country_is_ok(self):
|
||||||
query = "SELECT cdb_geocode_namedplace_point(city,province,country) " \
|
query = "SELECT cdb_geocode_namedplace_point(city,province,country) " \
|
||||||
"as geometry FROM {0} LIMIT 1&api_key={1}".format(
|
"as geometry FROM {0} LIMIT 1&api_key={1}".format(
|
||||||
self.env_variables['table_name'],
|
self.env_variables['table_name'],
|
||||||
self.env_variables['api_key'])
|
self.env_variables['api_key'])
|
||||||
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
assert_not_equal(geometry['geometry'], None)
|
assert_not_equal(geometry['geometry'], None)
|
||||||
|
|
||||||
def test_if_select_with_namedplace_without_api_key_raise_error(self):
|
def test_if_select_with_namedplace_without_api_key_raise_error(self):
|
||||||
query = "SELECT cdb_geocode_namedplace_point(city) as geometry " \
|
query = "SELECT cdb_geocode_namedplace_point(city) as geometry " \
|
||||||
"FROM {0} LIMIT 1".format(
|
"FROM {0} LIMIT 1".format(
|
||||||
self.env_variables['table_name'])
|
self.env_variables['table_name'])
|
||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Geocoding permission denied", "function cdb_geocode_namedplace_point(text) does not exist"])
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from nose.tools import assert_raises
|
from nose.tools import assert_raises
|
||||||
from nose.tools import assert_not_equal, assert_equal
|
from nose.tools import assert_not_equal, assert_in
|
||||||
from ..helpers.integration_test_helper import IntegrationTestHelper
|
from ..helpers.integration_test_helper import IntegrationTestHelper
|
||||||
|
|
||||||
|
|
||||||
@@ -12,30 +12,29 @@ class TestPostalcodeFunctions(TestCase):
|
|||||||
self.env_variables['schema'],
|
self.env_variables['schema'],
|
||||||
self.env_variables['username'],
|
self.env_variables['username'],
|
||||||
self.env_variables['host'],
|
self.env_variables['host'],
|
||||||
self.env_variables['api_key']
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_if_select_with_postalcode_polygon_is_ok(self):
|
def test_if_select_with_postalcode_polygon_is_ok(self):
|
||||||
query = "SELECT cdb_geocode_postalcode_polygon(postalcode, country) " \
|
query = "SELECT cdb_geocode_postalcode_polygon(postalcode, country) " \
|
||||||
"as geometry FROM {0} WHERE country='USA'&api_key={1}".format(
|
"as geometry FROM {0} WHERE country='USA'&api_key={1}".format(
|
||||||
self.env_variables['table_name'],
|
self.env_variables['table_name'],
|
||||||
self.env_variables['api_key'])
|
self.env_variables['api_key'])
|
||||||
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
assert_not_equal(geometry['geometry'], None)
|
assert_not_equal(geometry['geometry'], None)
|
||||||
|
|
||||||
def test_if_select_with_postalcode_point_is_ok(self):
|
def test_if_select_with_postalcode_point_is_ok(self):
|
||||||
query = "SELECT cdb_geocode_postalcode_point(postalcode, country) " \
|
query = "SELECT cdb_geocode_postalcode_point(postalcode, country) " \
|
||||||
"as geometry FROM {0} WHERE country='Spain'&api_key={1}".format(
|
"as geometry FROM {0} WHERE country='Spain'&api_key={1}".format(
|
||||||
self.env_variables['table_name'],
|
self.env_variables['table_name'],
|
||||||
self.env_variables['api_key'])
|
self.env_variables['api_key'])
|
||||||
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
geometry = IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
assert_not_equal(geometry['geometry'], None)
|
assert_not_equal(geometry['geometry'], None)
|
||||||
|
|
||||||
def test_if_select_with_postalcode_without_api_key_raise_error(self):
|
def test_if_select_with_postalcode_without_api_key_raise_error(self):
|
||||||
query = "SELECT cdb_geocode_postalcode_polygon(postalcode, country) " \
|
query = "SELECT cdb_geocode_postalcode_polygon(postalcode, country) " \
|
||||||
"as geometry FROM {0} WHERE country = 'USA'".format(
|
"as geometry FROM {0} WHERE country = 'USA'".format(
|
||||||
self.env_variables['table_name'])
|
self.env_variables['table_name'])
|
||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Geocoding permission denied", "function cdb_geocode_postalcode_polygon(text, text) does not exist"])
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from nose.tools import assert_raises
|
from nose.tools import assert_raises
|
||||||
from nose.tools import assert_not_equal, assert_equal
|
from nose.tools import assert_not_equal, assert_in
|
||||||
from ..helpers.integration_test_helper import IntegrationTestHelper
|
from ..helpers.integration_test_helper import IntegrationTestHelper
|
||||||
|
|
||||||
|
|
||||||
@@ -12,7 +12,6 @@ class TestRoutingFunctions(TestCase):
|
|||||||
self.env_variables['schema'],
|
self.env_variables['schema'],
|
||||||
self.env_variables['username'],
|
self.env_variables['username'],
|
||||||
self.env_variables['host'],
|
self.env_variables['host'],
|
||||||
self.env_variables['api_key']
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_if_select_with_routing_point_to_point_is_ok(self):
|
def test_if_select_with_routing_point_to_point_is_ok(self):
|
||||||
@@ -32,7 +31,7 @@ class TestRoutingFunctions(TestCase):
|
|||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Routing permission denied", "function cdb_route_point_to_point(geometry, geometry, unknown, text[]) does not exist"])
|
||||||
|
|
||||||
def test_if_select_with_routing_with_waypoints_is_ok(self):
|
def test_if_select_with_routing_with_waypoints_is_ok(self):
|
||||||
query = "SELECT duration, length, shape as the_geom " \
|
query = "SELECT duration, length, shape as the_geom " \
|
||||||
@@ -46,11 +45,12 @@ class TestRoutingFunctions(TestCase):
|
|||||||
|
|
||||||
def test_if_select_with_routing_with_waypoints_without_api_key_raise_error(self):
|
def test_if_select_with_routing_with_waypoints_without_api_key_raise_error(self):
|
||||||
query = "SELECT duration, length, shape as the_geom " \
|
query = "SELECT duration, length, shape as the_geom " \
|
||||||
"FROM cdb_route_with_waypoints(Array['POINT(-3.7109 40.4234)'::GEOMETRY, "\
|
"FROM cdb_route_with_waypoints(Array['POINT(-3.7109 40.4234)'::geometry, "\
|
||||||
"'POINT(-3.7059 40.4203)'::geometry, 'POINT(-3.7046 40.4180)'::geometry]" \
|
"'POINT(-3.7059 40.4203)'::geometry, 'POINT(-3.7046 40.4180)'::geometry]" \
|
||||||
"::geometry[], 'car', " \
|
"::geometry[], 'car', " \
|
||||||
"ARRAY['mode_type=shortest']::text[])&api_key={0}"
|
"ARRAY['mode_type=shortest']::text[])&api_key={0}".format(
|
||||||
|
self.env_variables['api_key'])
|
||||||
try:
|
try:
|
||||||
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
IntegrationTestHelper.execute_query(self.sql_api_url, query)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert_equal(e.message[0], "The api_key must be provided")
|
assert_in(e.message[0], ["Routing permission denied", "function cdb_route_with_waypoints(geometry, geometry, text, text[]) does not exist"])
|
||||||
|
|||||||
@@ -110,7 +110,6 @@ class TestStreetFunctionsSetUp(TestCase):
|
|||||||
self.env_variables['schema'],
|
self.env_variables['schema'],
|
||||||
self.env_variables['username'],
|
self.env_variables['username'],
|
||||||
self.env_variables['host'],
|
self.env_variables['host'],
|
||||||
self.env_variables['api_key']
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if not self.fixture_points:
|
if not self.fixture_points:
|
||||||
@@ -123,7 +122,6 @@ class TestStreetFunctionsSetUp(TestCase):
|
|||||||
|
|
||||||
self.metadata = self.METADATAS[provider]
|
self.metadata = self.METADATAS[provider]
|
||||||
|
|
||||||
|
|
||||||
def _run_authenticated(self, query):
|
def _run_authenticated(self, query):
|
||||||
authenticated_query = "{}&api_key={}".format(query,
|
authenticated_query = "{}&api_key={}".format(query,
|
||||||
self.env_variables[
|
self.env_variables[
|
||||||
@@ -137,6 +135,7 @@ class TestStreetFunctionsSetUp(TestCase):
|
|||||||
"where service = 'hires_geocoder'"
|
"where service = 'hires_geocoder'"
|
||||||
return self._run_authenticated(query)['rows'][0]['used_quota']
|
return self._run_authenticated(query)['rows'][0]['used_quota']
|
||||||
|
|
||||||
|
|
||||||
class TestStreetFunctions(TestStreetFunctionsSetUp):
|
class TestStreetFunctions(TestStreetFunctionsSetUp):
|
||||||
|
|
||||||
def test_if_select_with_street_point_is_ok(self):
|
def test_if_select_with_street_point_is_ok(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user