Пример #1
0
def _build_address_query_format(parsed_params):
    """Construye dos diccionarios a partir de parámetros de consulta
    recibidos, el primero representando la query a Elasticsearch a
    realizar y el segundo representando las propiedades de formato
    (presentación) que se le debe dar a los datos obtenidos de la misma.

    Args:
        parsed_params (dict): Parámetros de una consulta normalización de
            una dirección.

    Returns:
        tuple: diccionario de query y diccionario de formato

    """
    # Construir query a partir de parámetros
    query = utils.translate_keys(parsed_params, {
        N.DEPT: 'department',
        N.STATE: 'state',
        N.EXACT: 'exact',
        N.OFFSET: 'offset',
        N.ORDER: 'order',
        N.MAX: 'size'
    },
                                 ignore=[N.FLATTEN, N.FORMAT, N.FIELDS])

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

    return query, fmt
Пример #2
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)
Пример #3
0
def _process_entity_single(request, name, param_parser, key_translations):
    """Procesa una request GET para consultar datos de una entidad.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request GET 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
            el diccionario de parámetros del usuario a un diccionario
            representando una query 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:
        qs_params = param_parser.parse_get_params(request.args)
    except params.ParametersParseException as e:
        return formatter.create_param_error_response_single(e.errors, e.fmt)

    # Construir query a partir de parámetros
    query = utils.translate_keys(qs_params.values,
                                 key_translations,
                                 ignore=[N.FLATTEN, N.FORMAT])

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

    if fmt[N.FORMAT] == 'shp':
        query['fields'] += (N.GEOM, )

    es = get_elasticsearch()
    search_class = data.entity_search_class(name)
    search = search_class(query)

    data.ElasticsearchSearch.run_searches(es, [search])

    query_result = QueryResult.from_entity_list(search.result.hits,
                                                qs_params.received_values(),
                                                search.result.total,
                                                search.result.offset)

    return formatter.create_ok_response(name, query_result, fmt)
Пример #4
0
def _build_street_query_format(parsed_params):
    """Construye dos diccionarios a partir de parámetros de consulta
    recibidos, el primero representando la query a Elasticsearch a
    realizar y el segundo representando las propiedades de formato
    (presentación) que se le debe dar a los datos obtenidos de la misma.

    Args:
        parsed_params (dict): Parámetros de una consulta para el recurso de
            calles.

    Returns:
        tuple: diccionario de query y diccionario de formato

    """
    # Construir query a partir de parámetros
    query = utils.translate_keys(parsed_params, {
        N.ID: 'ids',
        N.NAME: 'name',
        N.INTERSECTION: 'geo_shape_ids',
        N.STATE: 'state',
        N.DEPT: 'department',
        N.CENSUS_LOCALITY: 'census_locality',
        N.EXACT: 'exact',
        N.FIELDS: 'fields',
        N.CATEGORY: 'category',
        N.OFFSET: 'offset',
        N.ORDER: 'order',
        N.MAX: 'size'
    },
                                 ignore=[N.FLATTEN, N.FORMAT])

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

    return query, fmt
Пример #5
0
def _build_location_query_format(parsed_params):
    """Construye dos diccionarios a partir de parámetros de consulta
    recibidos, el primero representando la query a Elasticsearch a
    realizar y el segundo representando las propiedades de formato
    (presentación) que se le debe dar a los datos obtenidos de la misma.

    Args:
        parsed_params (dict): Parámetros de una consulta para una ubicación.

    Returns:
        tuple: diccionario de query y diccionario de formato

    """
    # Construir query a partir de parámetros
    query = utils.translate_keys(parsed_params, {},
                                 ignore=[N.FLATTEN, N.FORMAT])

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

    return query, fmt