Ejemplo n.º 1
0
def _process_address_bulk(request):
    """Procesa una request POST para normalizar lote de direcciones.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request POST de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP

    """
    try:
        body_params = params.PARAMS_ADDRESSES.parse_post_params(
            request.args, request.json, N.ADDRESSES)
    except params.ParameterParsingException as e:
        return formatter.create_param_error_response_bulk(e.errors)

    query_results, formats = _process_address_queries(body_params)

    return formatter.create_ok_response_bulk(N.ADDRESSES, query_results,
                                             formats)
Ejemplo n.º 2
0
def _process_location_bulk(request):
    """Procesa una request POST para obtener entidades en varios puntos.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request POST de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP

    """
    try:
        body_params = params.PARAMS_LOCATION.parse_post_params(
            request.args, request.json, N.LOCATIONS)
    except params.ParameterParsingException as e:
        return formatter.create_param_error_response_bulk(e.errors)

    queries = []
    formats = []
    for parsed_params in body_params:
        query, fmt = _build_location_query_format(parsed_params)
        queries.append(query)
        formats.append(fmt)

    es = get_elasticsearch()
    results = location.run_location_queries(es, queries)

    return formatter.create_ok_response_bulk(N.LOCATION, results, formats)
Ejemplo n.º 3
0
def process_place_bulk(request):
    """Procesa una request POST para obtener entidades en varios puntos.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request POST de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP
    """
    body_params, errors = params.PARAMS_PLACE.parse_post_params(
        request.args, request.json and request.json.get(PLACES))

    if any(errors):
        return formatter.create_param_error_response_bulk(errors)

    queries = []
    formats = []
    for parsed_params in body_params:
        query, fmt = build_place_query_format(parsed_params)
        queries.append(query)
        formats.append(fmt)

    es = get_elasticsearch()
    results = process_place_queries(es, queries)

    return formatter.create_ok_response_bulk(PLACE, results, formats,
                                             iterable_result=False)
Ejemplo n.º 4
0
def process_address_bulk(request):
    """Procesa una request POST para normalizar lote de direcciones.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request POST de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP
    """
    body_params, errors = params.PARAMS_ADDRESSES.parse_post_params(
        request.args, request.json and request.json.get(ADDRESSES))

    if any(errors):
        return formatter.create_param_error_response_bulk(errors)

    queries = []
    formats = []
    for parsed_params in body_params:
        query, fmt = build_address_query_format(parsed_params)
        queries.append(query)
        formats.append(fmt)

    es = get_elasticsearch()
    results = data.search_streets(es, queries)

    source = get_index_source(STREETS)
    for result, query in zip(results, queries):
        build_addresses_result(result, query, source)

    return formatter.create_ok_response_bulk(ADDRESSES, results, formats)
Ejemplo n.º 5
0
def _process_entity_bulk(request, name, param_parser, key_translations):
    """Procesa una request POST para consultar datos de una lista de entidades.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request POST de flask.
        name (str): Nombre de la entidad.
        param_parser (ParameterSet): Objeto utilizado para parsear los
            parámetros.
        key_translations (dict): Traducciones de keys a utilizar para convertir
            los diccionarios de parámetros del usuario a una lista de
            diccionarios representando las queries a Elasticsearch.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP

    """
    try:
        body_params = param_parser.parse_post_params(request.args,
                                                     request.json, name)
    except params.ParametersParseException as e:
        return formatter.create_param_error_response_bulk(e.errors)

    queries = []
    formats = []
    for parsed_params in body_params:
        # Construir query a partir de parámetros
        query = utils.translate_keys(parsed_params.values,
                                     key_translations,
                                     ignore=[N.FLATTEN, N.FORMAT])

        # Construir reglas de formato a partir de parámetros
        fmt = {
            key: parsed_params.values[key]
            for key in [N.FLATTEN, N.FIELDS] if key in parsed_params.values
        }

        queries.append(query)
        formats.append(fmt)

    es = get_elasticsearch()
    search_class = data.entity_search_class(name)
    searches = [search_class(query) for query in queries]

    data.ElasticsearchSearch.run_searches(es, searches)

    query_results = [
        QueryResult.from_entity_list(search.result.hits,
                                     params.received_values(),
                                     search.result.total, search.result.offset)
        for search, params in zip(searches, body_params)
    ]

    return formatter.create_ok_response_bulk(name, query_results, formats)
Ejemplo n.º 6
0
def process_entity_bulk(request, name, param_parser, key_translations, index):
    """Procesa una request POST para consultar datos de una lista de entidades.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request POST de flask.
        name (str): Nombre de la entidad.
        param_parser (ParameterSet): Objeto utilizado para parsear los
            parámetros.
        key_translations (dict): Traducciones de keys a utilizar para convertir
            los diccionarios de parámetros del usuario a una lista de
            diccionarios representando las queries a Elasticsearch.
        index (str): Nombre del índice a consultar.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP
    """
    body_params, errors = param_parser.parse_post_params(
        request.args, request.json and request.json.get(name))

    if any(errors):
        return formatter.create_param_error_response_bulk(errors)

    queries = []
    formats = []
    for parsed_params in body_params:
        # Construir query a partir de parámetros
        query = translate_keys(parsed_params, key_translations,
                               ignore=[FLATTEN, FORMAT])

        # Construir reglas de formato a partir de parámetros
        fmt = {
            key: parsed_params[key]
            for key in [FLATTEN, FIELDS]
            if key in parsed_params
        }

        queries.append(query)
        formats.append(fmt)

    es = get_elasticsearch()
    results = data.search_entities(es, index, queries)

    source = get_index_source(index)
    for result in results:
        for match in result:
            match[SOURCE] = source

    return formatter.create_ok_response_bulk(name, results, formats)
Ejemplo n.º 7
0
def _process_street_bulk(request):
    """Procesa una request POST para consultar datos de calles.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request POST de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP

    """
    try:
        body_params = params.PARAMS_STREETS.parse_post_params(
            request.args, request.json, N.STREETS)
    except params.ParameterParsingException as e:
        return formatter.create_param_error_response_bulk(e.errors)

    queries = []
    formats = []
    for parsed_params in body_params:
        query, fmt = _build_street_query_format(parsed_params)
        queries.append(query)
        formats.append(fmt)

    es = get_elasticsearch()
    searches = [data.StreetsSearch(query) for query in queries]

    data.ElasticsearchSearch.run_searches(es, searches)

    query_results = [
        QueryResult.from_entity_list(search.result.hits, search.result.total,
                                     search.result.offset)
        for search in searches
    ]

    return formatter.create_ok_response_bulk(N.STREETS, query_results, formats)
Ejemplo n.º 8
0
def _process_street_bulk(request):
    """Procesa una request POST para consultar datos de calles.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request POST de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP

    """
    try:
        body_params = params.PARAMS_STREETS.parse_post_params(
            request.args, request.json, N.STREETS)
    except params.ParametersParseException as e:
        return formatter.create_param_error_response_bulk(e.errors)

    query_results, formats = _process_street_queries(body_params)
    return formatter.create_ok_response_bulk(N.STREETS, query_results, formats)
Ejemplo n.º 9
0
def process_street_bulk(request):
    """Procesa una request POST para consultar datos de calles.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request POST de flask.

    Raises:
        data.DataConnectionException: En caso de ocurrir un error de
            conexión con la capa de manejo de datos.

    Returns:
        flask.Response: respuesta HTTP
    """
    body_params, errors = params.PARAMS_STREETS.parse_post_params(
        request.args, request.json and request.json.get(STREETS))

    if any(errors):
        return formatter.create_param_error_response_bulk(errors)

    queries = []
    formats = []
    for parsed_params in body_params:
        query, fmt = build_street_query_format(parsed_params)
        queries.append(query)
        formats.append(fmt)

    es = get_elasticsearch()
    results = data.search_streets(es, queries)

    source = get_index_source(STREETS)
    for result in results:
        for match in result:
            match[SOURCE] = source

    return formatter.create_ok_response_bulk(STREETS, results, formats)