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))