From 984519e7f1adc95764d5f07a614842fa024507ac Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Fri, 22 Jan 2016 09:52:19 +0100 Subject: [PATCH] Change to have functions for all the geocoder types but only one function to call them --- .../extension/sql/0.1.0/20_geocode_street.sql | 30 +++++++++++++++++-- .../cartodb_geocoder/config_helper.py | 19 +++++------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/server/extension/sql/0.1.0/20_geocode_street.sql b/server/extension/sql/0.1.0/20_geocode_street.sql index 941743e..c95662d 100644 --- a/server/extension/sql/0.1.0/20_geocode_street.sql +++ b/server/extension/sql/0.1.0/20_geocode_street.sql @@ -1,13 +1,31 @@ --- Geocodes a street address given a searchtext and a state and/or country +-- We have change arguments so we need to drop the former function DROP FUNCTION IF EXISTS cdb_geocoder_server.cdb_geocode_street_point(TEXT, TEXT, TEXT, TEXT); + +-- Geocodes a street address given a searchtext and a state and/or country CREATE OR REPLACE FUNCTION cdb_geocoder_server.cdb_geocode_street_point(username TEXT, orgname TEXT, searchtext TEXT, city TEXT DEFAULT NULL, state_province TEXT DEFAULT NULL, country TEXT DEFAULT NULL) +RETURNS Geometry AS $$ + plpy.execute("SELECT cdb_geocoder_server._connect_to_redis('{0}')".format(username)) + redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] + plpy.execute("SELECT cdb_geocoder_server._get_geocoder_config('{0}', '{1}')".format(username, orgname)) + user_geocoder_config = GD["user_geocoder_config_{0}".format(username)] + + if user_geocoder_config.heremaps_geocoder: + here_plan = plpy.prepare("SELECT cdb_geocoder_server._cdb_here_geocode_street_point($1, $2, $3, $4, $5, $6) as point; ", ["text", "text", "text", "text", "text", "text"]) + return plpy.execute(here_plan, [username, orgname, searchtext, city, state_province, country], 1)[0]['point'] + elif user_geocoder_config.google_geocoder: + google_plan = plpy.prepare("SELECT cdb_geocoder_server._cdb_google_geocode_street_point($1, $2, $3, $4, $5, $6) as point; ", ["text", "text", "text", "text", "text", "text"]) + return plpy.execute(google_plan, [username, orgname, searchtext, city, state_province, country], 1)[0]['point'] + else: + plpy.error('Requested geocoder is not available') + +$$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_geocoder_server._cdb_here_geocode_street_point(username TEXT, orgname TEXT, searchtext TEXT, city TEXT DEFAULT NULL, state_province TEXT DEFAULT NULL, country TEXT DEFAULT NULL) RETURNS Geometry AS $$ from heremaps import heremapsgeocoder from cartodb_geocoder import quota_service - plpy.execute("SELECT cdb_geocoder_server._connect_to_redis('{0}')".format(username)) redis_conn = GD["redis_connection_{0}".format(username)]['redis_metrics_connection'] - plpy.execute("SELECT cdb_geocoder_server._get_geocoder_config('{0}', '{1}')".format(username, orgname)) user_geocoder_config = GD["user_geocoder_config_{0}".format(username)] # -- Check the quota @@ -35,3 +53,9 @@ RETURNS Geometry AS $$ plpy.error(error_msg) $$ LANGUAGE plpythonu; + +CREATE OR REPLACE FUNCTION cdb_geocoder_server._cdb_google_geocode_street_point(username TEXT, orgname TEXT, searchtext TEXT, city TEXT DEFAULT NULL, state_province TEXT DEFAULT NULL, country TEXT DEFAULT NULL) +RETURNS Geometry AS $$ + plpy.error('Google geocoder is not available yet') + return None +$$ LANGUAGE plpythonu; diff --git a/server/lib/python/cartodb_geocoder/cartodb_geocoder/config_helper.py b/server/lib/python/cartodb_geocoder/cartodb_geocoder/config_helper.py index def1b47..9c069fc 100644 --- a/server/lib/python/cartodb_geocoder/cartodb_geocoder/config_helper.py +++ b/server/lib/python/cartodb_geocoder/cartodb_geocoder/config_helper.py @@ -75,23 +75,18 @@ class GeocoderConfig: else: self._orgname = None self._geocoder_type = filtered_config[self.GEOCODER_TYPE].lower() + self._geocoding_quota = float(filtered_config[self.QUOTA_KEY]) self._period_end_date = date_parse(filtered_config[self.PERIOD_END_DATE]) - self._google_maps_api_key = None - self._google_maps_client_id = None - self._geocoding_quota = 0 - self._soft_geocoding_limit = False - if self.GOOGLE_GEOCODER == self._geocoder_type: - self._google_maps_api_key = filtered_config[self.GOOGLE_GEOCODER_API_KEY] - self._google_maps_client_id = filtered_config[self.GOOGLE_GEOCODER_CLIENT_ID] - elif self.NOKIA_GEOCODER == self._geocoder_type: - self._geocoding_quota = float(filtered_config[self.QUOTA_KEY]) - self._heremaps_app_id = filtered_config[self.NOKIA_GEOCODER_APP_ID_KEY] - self._heremaps_app_code = filtered_config[self.NOKIA_GEOCODER_APP_CODE_KEY] - if filtered_config[self.SOFT_LIMIT_KEY].lower() == 'true': self._soft_geocoding_limit = True else: self._soft_geocoding_limit = False + if filtered_config[self.GEOCODER_TYPE].lower() == self.NOKIA_GEOCODER: + self._heremaps_app_id = filtered_config[self.NOKIA_GEOCODER_APP_ID_KEY] + self._heremaps_app_code = filtered_config[self.NOKIA_GEOCODER_APP_CODE_KEY] + elif filtered_config[self.GEOCODER_TYPE].lower() == self.GOOGLE_GEOCODER: + self._google_maps_api_key = filtered_config[self.GOOGLE_GEOCODER_API_KEY] + self._google_maps_client_id = filtered_config[self.GOOGLE_GEOCODER_CLIENT_ID] @property def service_type(self):