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