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