Пример #1
0
def _process_street_single(request):
    """Procesa una request GET para consultar datos de calles.
    En caso de ocurrir un error de parseo, se retorna una respuesta HTTP 400.

    Args:
        request (flask.Request): Request GET 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:
        qs_params = params.PARAMS_STREETS.parse_get_params(request.args)
    except params.ParameterParsingException as e:
        return formatter.create_param_error_response_single(e.errors, e.fmt)

    query, fmt = _build_street_query_format(qs_params)

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

    es = get_elasticsearch()
    search = data.StreetsSearch(query)
    data.ElasticsearchSearch.run_searches(es, [search])

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

    return formatter.create_ok_response(N.STREETS, query_result, fmt)
Пример #2
0
def run_street_queries(es, params_list, queries, formats):
    """Punto de entrada del módulo 'street.py'. Toma una lista de consultas de
    calles y las ejecuta, devolviendo los resultados QueryResult.

    Args:
        es (Elasticsearch): Conexión a Elasticsearch.
        params_list (list): Lista de ParametersParseResult.
        queries (list): Lista de búsquedas, generadas a partir de
            'params_list'.
        formats (list): Lista de parámetros de formato de cada búsqueda, en
            forma de diccionario.

    Returns:
        list: Lista de QueryResult, una por cada búsqueda.

    """

    searches = []
    for query, fmt in zip(queries, formats):
        processed_query = query.copy()

        if N.FULL_NAME in fmt[N.FIELDS]:
            # La nomenclatura incluye el nombre de la provincia y del depto.,
            # agregar esos campos a la query para luego poder extraer sus
            # nombres.
            processed_query['fields'] += (N.STATE, N.DEPT)

        searches.append(data.StreetsSearch(processed_query))

    data.ElasticsearchSearch.run_searches(es, searches)

    for search, fmt in zip(searches, formats):
        if N.FULL_NAME in fmt[N.FIELDS]:
            # Agregar nomenclatura a cada hit del resultado.
            for hit in search.result.hits:
                full_name = '{}, {}, {}'.format(hit[N.NAME],
                                                hit[N.DEPT][N.NAME],
                                                hit[N.STATE][N.NAME])
                hit[N.FULL_NAME] = full_name

    return [
        QueryResult.from_entity_list(search.result.hits,
                                     params.received_values(),
                                     search.result.total, search.result.offset)
        for search, params in zip(searches, params_list)
    ]
Пример #3
0
    def _build_street_search(self, street, add_number=False):
        """Método de utilidad para crear búsquedas de tipo StreetsSearch.

        Args:
            street (str): Nombre de la calle a buscar.
            add_number (bool): Si es verdadero, agrega a la búsqueda un
                filtrado por altura, utilizando el atributo
                '_numerical_door_number'.

        """
        query = self._query.copy()

        query['name'] = street
        if add_number and self._numerical_door_number:
            query['number'] = self._numerical_door_number
        query['size'] = constants.MAX_RESULT_LEN
        query['offset'] = 0

        return data.StreetsSearch(query)
Пример #4
0
    def planner_steps(self):
        """Crea un iterador de ElasticsearchSearch, representando los pasos
        requeridos para completar la búsqueda de los datos la dirección.

        Pasos requeridos:
            1) Búsqueda de la calle principal.

        Yields:
            ElasticsearchSearch: Búsqueda que debe ser ejecutada por el
                invocador de 'next()'.

        """
        query = self._query.copy()
        query['name'] = self._address_data.street_names[0]

        if self._numerical_door_number:
            query['number'] = self._numerical_door_number

        self._elasticsearch_result = yield data.StreetsSearch(query)
Пример #5
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)