Metadata attributes constant extraction

This commit is contained in:
Juan Ignacio Sánchez Lara
2018-07-17 12:46:16 +02:00
parent e9ed3bca18
commit c104f6f34b
8 changed files with 28 additions and 23 deletions
@@ -35,6 +35,3 @@ def _reset():
GD = None GD = None
from geocoder import run_street_point_geocoder, StreetPointBulkGeocoder from geocoder import run_street_point_geocoder, StreetPointBulkGeocoder
PRECISION_PRECISE = 'precise'
PRECISION_INTERPOLATED = 'interpolated'
@@ -6,6 +6,13 @@ from collections import namedtuple
import json import json
METADATA_RELEVANCE = 'relevance'
METADATA_PRECISION = 'precision'
METADATA_MATCH_TYPES = 'match_types'
PRECISION_PRECISE = 'precise'
PRECISION_INTERPOLATED = 'interpolated'
def compose_address(street, city=None, state=None, country=None): def compose_address(street, city=None, state=None, country=None):
return ', '.join(filter(None, [street, city, state, country])) return ', '.join(filter(None, [street, city, state, country]))
@@ -4,8 +4,7 @@
from urlparse import parse_qs from urlparse import parse_qs
from exceptions import MalformedResult from exceptions import MalformedResult
from cartodb_services import PRECISION_PRECISE, PRECISION_INTERPOLATED 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
from cartodb_services.google.exceptions import InvalidGoogleCredentials from cartodb_services.google.exceptions import InvalidGoogleCredentials
from client_factory import GoogleMapsClientFactory from client_factory import GoogleMapsClientFactory
@@ -84,9 +83,9 @@ class GoogleMapsGeocoder():
match_types = [MATCH_TYPE_BY_MATCH_LEVEL.get(match_level, None) match_types = [MATCH_TYPE_BY_MATCH_LEVEL.get(match_level, None)
for match_level in result['types']] for match_level in result['types']]
return { return {
'relevance': base_relevance * partial_factor, METADATA_RELEVANCE: base_relevance * partial_factor,
'precision': PRECISION_BY_LOCATION_TYPE[location_type], METADATA_PRECISION: PRECISION_BY_LOCATION_TYPE[location_type],
'match_types': filter(None, match_types) METADATA_MATCH_TYPES: filter(None, match_types)
} }
@@ -8,6 +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 METADATA_RELEVANCE, METADATA_PRECISION, METADATA_MATCH_TYPES
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
@@ -138,9 +139,9 @@ class HereMapsBulkGeocoder(HereMapsGeocoder, StreetPointBulkGeocoder):
results.append((row['recId'], results.append((row['recId'],
[row['displayLongitude'], row['displayLatitude']], [row['displayLongitude'], row['displayLatitude']],
{ {
'relevance': float(row['relevance']), METADATA_RELEVANCE: float(row['relevance']),
'precision': precision, METADATA_PRECISION: precision,
'match_types': [match_type] if match_type else [] METADATA_MATCH_TYPES: [match_type] if match_type else []
})) }))
return results return results
@@ -6,7 +6,7 @@ import requests
from requests.adapters import HTTPAdapter from requests.adapters import HTTPAdapter
from exceptions import * from exceptions import *
from cartodb_services import PRECISION_PRECISE, PRECISION_INTERPOLATED from cartodb_services.geocoder import METADATA_RELEVANCE, METADATA_PRECISION, METADATA_MATCH_TYPES, PRECISION_PRECISE, PRECISION_INTERPOLATED
from cartodb_services.metrics import Traceable from cartodb_services.metrics import Traceable
class HereMapsGeocoder(Traceable): class HereMapsGeocoder(Traceable):
@@ -147,7 +147,7 @@ class HereMapsGeocoder(Traceable):
result.get('MatchType', 'pointAddress')] result.get('MatchType', 'pointAddress')]
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 { return {
'relevance': result['Relevance'], METADATA_RELEVANCE: result['Relevance'],
'precision': precision, METADATA_PRECISION: precision,
'match_types': [match_type] if match_type else [] METADATA_MATCH_TYPES: [match_type] if match_type else []
} }
@@ -5,7 +5,7 @@ Python client for the Mapbox Geocoder service.
import json import json
import requests import requests
from mapbox import Geocoder from mapbox import Geocoder
from cartodb_services import PRECISION_PRECISE, PRECISION_INTERPOLATED from cartodb_services.geocoder import METADATA_RELEVANCE, METADATA_PRECISION, METADATA_MATCH_TYPES, PRECISION_PRECISE, 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
from cartodb_services.tools.qps import qps_retry from cartodb_services.tools.qps import qps_retry
@@ -93,9 +93,9 @@ class MapboxGeocoder(Traceable):
match_types = [MATCH_TYPE_BY_MATCH_LEVEL.get(match_level, None) match_types = [MATCH_TYPE_BY_MATCH_LEVEL.get(match_level, None)
for match_level in result['place_type']] for match_level in result['place_type']]
return { return {
'relevance': self._normalize_relevance(float(result['relevance'])), METADATA_RELEVANCE: self._normalize_relevance(float(result['relevance'])),
'precision': precision, METADATA_PRECISION: precision,
'match_types': filter(None, match_types) METADATA_MATCH_TYPES: filter(None, match_types)
} }
def _normalize_relevance(self, relevance): def _normalize_relevance(self, relevance):
@@ -5,7 +5,7 @@ import json
import requests import requests
from uritemplate import URITemplate from uritemplate import URITemplate
from math import tanh from math import tanh
from cartodb_services import PRECISION_PRECISE, PRECISION_INTERPOLATED from cartodb_services.geocoder import METADATA_RELEVANCE, METADATA_PRECISION, METADATA_MATCH_TYPES, PRECISION_PRECISE, 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
from cartodb_services.tools.qps import qps_retry from cartodb_services.tools.qps import qps_retry
@@ -145,9 +145,9 @@ class TomTomGeocoder(Traceable):
score = self._normalize_score(result['score']) score = self._normalize_score(result['score'])
match_type = MATCH_TYPE_BY_MATCH_LEVEL.get(result['type'], None) match_type = MATCH_TYPE_BY_MATCH_LEVEL.get(result['type'], None)
return { return {
'relevance': score, METADATA_RELEVANCE: score,
'precision': self._precision_from_score(score), METADATA_PRECISION: self._precision_from_score(score),
'match_types': [match_type] if match_type else [] METADATA_MATCH_TYPES: [match_type] if match_type else []
} }
def _normalize_score(self, score): def _normalize_score(self, score):
@@ -384,6 +384,7 @@ class TestBulkStreetFunctions(TestStreetFunctionsSetUp):
self.metadata['Plaza España, Barcelona'], self.metadata['Plaza España, Barcelona'],
self.metadata['Santiago Rusiñol 123, Valladolid'] self.metadata['Santiago Rusiñol 123, Valladolid']
] ]
assert_equal(len(response['rows']), len(expected))
for r, e in zip(response['rows'], expected): for r, e in zip(response['rows'], expected):
self.assert_metadata(r['metadata'], e) self.assert_metadata(r['metadata'], e)