def run_street_point_geocoder(plpy, GD, geocoder, service_manager, username, orgname, searches_string): plpy.execute("SELECT cdb_dataservices_server._get_logger_config()") logger_config = GD["logger_config"] logger = Logger(logger_config) success_count, failed_count, empty_count = 0, 0, 0 try: searches = json.loads(searches_string) except Exception as e: logger.error('Parsing searches', exception=e, data={'searches': searches_string}) raise e try: service_manager.assert_within_limits(quota=False) geocode_results = geocoder.bulk_geocode(searches) results = [] a_failed_one = None if not geocode_results == EMPTY_BATCH_RESPONSE: for result in geocode_results: metadata = result[2] if len(result) > 2 else {} try: if metadata.get('error', None): results.append([result[0], None, json.dumps(metadata)]) a_failed_one = result failed_count += 1 elif result[1] and len(result[1]) == 2: plan = plpy.prepare( "SELECT ST_SetSRID(ST_MakePoint($1, $2), 4326) as the_geom; ", ["double precision", "double precision"]) point = plpy.execute(plan, result[1], 1)[0] results.append([ result[0], point['the_geom'], json.dumps(metadata) ]) success_count += 1 else: results.append([result[0], None, json.dumps(metadata)]) empty_count += 1 except Exception as e: import sys logger.error("Error processing geocode", sys.exc_info(), data={ "username": username, "orgname": orgname }) metadata['processing_error'] = 'Error: {}'.format( e.message) results.append([result[0], None, json.dumps(metadata)]) failed_count += 1 missing_count = len( searches) - success_count - failed_count - empty_count if a_failed_one: logger.warning("failed geocoding", data={ "username": username, "orgname": orgname, "failed": str(a_failed_one), "success_count": success_count, "empty_count": empty_count, "missing_count": missing_count, "failed_count": failed_count }) else: logger.debug("finished geocoding", data={ "username": username, "orgname": orgname, "success_count": success_count, "empty_count": empty_count, "missing_count": missing_count, "failed_count": failed_count }) service_manager.quota_service.increment_success_service_use( success_count) service_manager.quota_service.increment_empty_service_use( empty_count + missing_count) service_manager.quota_service.increment_failed_service_use( failed_count) return results except QuotaExceededException as qe: logger.debug('QuotaExceededException at run_street_point_geocoder', qe, data={ "username": username, "orgname": orgname }) service_manager.quota_service.increment_failed_service_use( len(searches)) return [] except BaseException as e: import sys service_manager.quota_service.increment_failed_service_use( len(searches)) service_manager.logger.error( 'Error trying to bulk geocode street point', sys.exc_info(), data={ "username": username, "orgname": orgname }) raise Exception('Error trying to bulk geocode street') finally: service_manager.quota_service.increment_total_service_use( len(searches))