diff --git a/server/lib/python/cartodb_services/cartodb_services/geocoder.py b/server/lib/python/cartodb_services/cartodb_services/geocoder.py index 47e6d3a..465118d 100644 --- a/server/lib/python/cartodb_services/cartodb_services/geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/geocoder.py @@ -6,13 +6,17 @@ from collections import namedtuple import json -METADATA_RELEVANCE = 'relevance' -METADATA_PRECISION = 'precision' -METADATA_MATCH_TYPES = 'match_types' - PRECISION_PRECISE = 'precise' PRECISION_INTERPOLATED = 'interpolated' + +def geocoder_metadata(relevance, precision, match_types): + return { + 'relevance': round(relevance, 2), + 'precision': precision, + 'match_types': match_types + } + def compose_address(street, city=None, state=None, country=None): return ', '.join(filter(None, [street, city, state, country])) diff --git a/server/lib/python/cartodb_services/cartodb_services/google/geocoder.py b/server/lib/python/cartodb_services/cartodb_services/google/geocoder.py index 2f82549..fb75c76 100644 --- a/server/lib/python/cartodb_services/cartodb_services/google/geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/google/geocoder.py @@ -4,7 +4,7 @@ from urlparse import parse_qs from exceptions import MalformedResult -from cartodb_services.geocoder import compose_address, METADATA_RELEVANCE, METADATA_PRECISION, METADATA_MATCH_TYPES, PRECISION_PRECISE, PRECISION_INTERPOLATED +from cartodb_services.geocoder import compose_address, geocoder_metadata, PRECISION_PRECISE, PRECISION_INTERPOLATED from cartodb_services.google.exceptions import InvalidGoogleCredentials from client_factory import GoogleMapsClientFactory @@ -82,11 +82,11 @@ class GoogleMapsGeocoder(): partial_factor = PARTIAL_FACTOR if partial_match else 1 match_types = [MATCH_TYPE_BY_MATCH_LEVEL.get(match_level, None) for match_level in result['types']] - return { - METADATA_RELEVANCE: base_relevance * partial_factor, - METADATA_PRECISION: PRECISION_BY_LOCATION_TYPE[location_type], - METADATA_MATCH_TYPES: filter(None, match_types) - } + return geocoder_metadata( + base_relevance * partial_factor, + PRECISION_BY_LOCATION_TYPE[location_type], + filter(None, match_types) + ) def _build_optional_parameters(self, city=None, state=None, diff --git a/server/lib/python/cartodb_services/cartodb_services/here/bulk_geocoder.py b/server/lib/python/cartodb_services/cartodb_services/here/bulk_geocoder.py index b501c6e..8316c44 100644 --- a/server/lib/python/cartodb_services/cartodb_services/here/bulk_geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/here/bulk_geocoder.py @@ -8,7 +8,7 @@ from collections import namedtuple from requests.adapters import HTTPAdapter from cartodb_services import StreetPointBulkGeocoder from cartodb_services.here import HereMapsGeocoder -from cartodb_services.geocoder import METADATA_RELEVANCE, METADATA_PRECISION, METADATA_MATCH_TYPES +from cartodb_services.geocoder import geocoder_metadata from cartodb_services.metrics import Traceable from cartodb_services.tools.exceptions import ServiceException @@ -138,11 +138,11 @@ class HereMapsBulkGeocoder(HereMapsGeocoder, StreetPointBulkGeocoder): match_type = self.MATCH_TYPE_BY_MATCH_LEVEL.get(row['matchLevel'], None) results.append((row['recId'], [row['displayLongitude'], row['displayLatitude']], - { - METADATA_RELEVANCE: float(row['relevance']), - METADATA_PRECISION: precision, - METADATA_MATCH_TYPES: [match_type] if match_type else [] - })) + geocoder_metadata( + float(row['relevance']), + precision, + [match_type] if match_type else [] + ))) return results diff --git a/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py b/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py index 52014b9..23dd871 100644 --- a/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/here/geocoder.py @@ -6,7 +6,7 @@ import requests from requests.adapters import HTTPAdapter from exceptions import * -from cartodb_services.geocoder import METADATA_RELEVANCE, METADATA_PRECISION, METADATA_MATCH_TYPES, PRECISION_PRECISE, PRECISION_INTERPOLATED +from cartodb_services.geocoder import PRECISION_PRECISE, PRECISION_INTERPOLATED, geocoder_metadata from cartodb_services.metrics import Traceable class HereMapsGeocoder(Traceable): @@ -146,8 +146,8 @@ class HereMapsGeocoder(Traceable): precision = self.PRECISION_BY_MATCH_TYPE[ result.get('MatchType', 'pointAddress')] match_type = self.MATCH_TYPE_BY_MATCH_LEVEL.get(result['MatchLevel'], None) - return { - METADATA_RELEVANCE: result['Relevance'], - METADATA_PRECISION: precision, - METADATA_MATCH_TYPES: [match_type] if match_type else [] - } + return geocoder_metadata( + result['Relevance'], + precision, + [match_type] if match_type else [] + ) diff --git a/server/lib/python/cartodb_services/cartodb_services/mapbox/geocoder.py b/server/lib/python/cartodb_services/cartodb_services/mapbox/geocoder.py index 59c707b..d76937a 100644 --- a/server/lib/python/cartodb_services/cartodb_services/mapbox/geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/mapbox/geocoder.py @@ -5,7 +5,7 @@ Python client for the Mapbox Geocoder service. import json import requests from mapbox import Geocoder -from cartodb_services.geocoder import METADATA_RELEVANCE, METADATA_PRECISION, METADATA_MATCH_TYPES, PRECISION_PRECISE, PRECISION_INTERPOLATED +from cartodb_services.geocoder import PRECISION_PRECISE, PRECISION_INTERPOLATED, geocoder_metadata from cartodb_services.metrics import Traceable from cartodb_services.tools.exceptions import ServiceException from cartodb_services.tools.qps import qps_retry @@ -92,11 +92,11 @@ class MapboxGeocoder(Traceable): match_types = [MATCH_TYPE_BY_MATCH_LEVEL.get(match_level, None) for match_level in result['place_type']] - return { - METADATA_RELEVANCE: self._normalize_relevance(float(result['relevance'])), - METADATA_PRECISION: precision, - METADATA_MATCH_TYPES: filter(None, match_types) - } + return geocoder_metadata( + self._normalize_relevance(float(result['relevance'])), + precision, + filter(None, match_types) + ) def _normalize_relevance(self, relevance): return 1 if relevance >= 0.99 else relevance diff --git a/server/lib/python/cartodb_services/cartodb_services/tomtom/geocoder.py b/server/lib/python/cartodb_services/cartodb_services/tomtom/geocoder.py index d1c5bed..46cdbda 100644 --- a/server/lib/python/cartodb_services/cartodb_services/tomtom/geocoder.py +++ b/server/lib/python/cartodb_services/cartodb_services/tomtom/geocoder.py @@ -5,7 +5,7 @@ import json import requests from uritemplate import URITemplate from math import tanh -from cartodb_services.geocoder import METADATA_RELEVANCE, METADATA_PRECISION, METADATA_MATCH_TYPES, PRECISION_PRECISE, PRECISION_INTERPOLATED +from cartodb_services.geocoder import PRECISION_PRECISE, PRECISION_INTERPOLATED, geocoder_metadata from cartodb_services.metrics import Traceable from cartodb_services.tools.exceptions import ServiceException from cartodb_services.tools.qps import qps_retry @@ -144,11 +144,11 @@ class TomTomGeocoder(Traceable): def _extract_metadata_from_result(self, result): score = self._normalize_score(result['score']) match_type = MATCH_TYPE_BY_MATCH_LEVEL.get(result['type'], None) - return { - METADATA_RELEVANCE: score, - METADATA_PRECISION: self._precision_from_score(score), - METADATA_MATCH_TYPES: [match_type] if match_type else [] - } + return geocoder_metadata( + score, + self._precision_from_score(score), + [match_type] if match_type else [] + ) def _normalize_score(self, score): return tanh(score * SCORE_NORMALIZATION_FACTOR) diff --git a/test/integration/test_street_functions.py b/test/integration/test_street_functions.py index 8535139..df30d66 100644 --- a/test/integration/test_street_functions.py +++ b/test/integration/test_street_functions.py @@ -87,14 +87,14 @@ class TestStreetFunctionsSetUp(TestCase): 'Plaza España, Barcelona': {'relevance': 0.85, 'precision': 'precise', 'match_types': ['street']}, 'Santiago Rusiñol 123, Valladolid': - {'relevance': 0.448283494533, 'precision': 'interpolated', 'match_types': ['street']} + {'relevance': 0.45, 'precision': 'interpolated', 'match_types': ['street']} } MAPBOX_METADATAS = { 'Plaza España, Barcelona': - {'relevance': 0.666, 'precision': 'precise', 'match_types': ['point_of_interest']}, + {'relevance': 0.67, 'precision': 'precise', 'match_types': ['point_of_interest']}, 'Santiago Rusiñol 123, Valladolid': - {'relevance': 0.666, 'precision': 'precise', 'match_types': ['point_of_interest']} # TODO: wrong + {'relevance': 0.67, 'precision': 'precise', 'match_types': ['point_of_interest']} # TODO: wrong } METADATAS = { @@ -410,7 +410,7 @@ class TestBulkStreetFunctions(TestStreetFunctionsSetUp): def assert_metadata(metadata, expected): relevance = metadata['relevance'] expected_relevance = expected['relevance'] - assert_true(isclose(relevance, expected_relevance, 0.05), + assert_true(isclose(relevance, expected_relevance, 0.02), '{} not close to {}'.format(relevance, expected_relevance)) assert_equal(metadata['precision'], expected['precision'])